У меня есть кадр данных, который выглядит следующим образом:dplyr: максимальное значение в группе, исключая значение в каждой строке?
> df <- data_frame(g = c('A', 'A', 'B', 'B', 'B', 'C'), x = c(7, 3, 5, 9, 2, 4))
> df
Source: local data frame [6 x 2]
g x
1 A 7
2 A 3
3 B 5
4 B 9
5 B 2
6 C 4
Я знаю, как добавить столбец с максимальным x
значения для каждой группы g
:
> df %>% group_by(g) %>% mutate(x_max = max(x))
Source: local data frame [6 x 3]
Groups: g
g x x_max
1 A 7 7
2 A 3 7
3 B 5 9
4 B 9 9
5 B 2 9
6 C 4 4
Но то, что я хотел бы, чтобы get - максимальное значение x
для каждой группы g
, , за исключением значения x
в каждой строке.
Для данного примера, желаемый результат будет выглядеть следующим образом:
Source: local data frame [6 x 3]
Groups: g
g x x_max x_max_exclude
1 A 7 7 3
2 A 3 7 7
3 B 5 9 9
4 B 9 9 5
5 B 2 9 9
6 C 4 4 NA
Я думал, что я мог бы быть в состоянии использовать row_number()
, чтобы удалить отдельные элементы и взять максимум из того, что осталось, но удар предупредительных сообщений и получил неправильный -Inf
выход:
> df %>% group_by(g) %>% mutate(x_max = max(x), r = row_number(), x_max_exclude = max(x[-r]))
Source: local data frame [6 x 5]
Groups: g
g x x_max r x_max_exclude
1 A 7 7 1 -Inf
2 A 3 7 2 -Inf
3 B 5 9 1 -Inf
4 B 9 9 2 -Inf
5 B 2 9 3 -Inf
6 C 4 4 1 -Inf
Warning messages:
1: In max(c(4, 9, 2)[-1:3]) :
no non-missing arguments to max; returning -Inf
2: In max(c(4, 9, 2)[-1:3]) :
no non-missing arguments to max; returning -Inf
3: In max(c(4, 9, 2)[-1:3]) :
no non-missing arguments to max; returning -Inf
Что является наиболее {читаемый, краткий, эффективный} способа получить этот вывод в dplyr? Любое понимание того, почему моя попытка с использованием row_number()
не работает, также будет высоко оценена. Спасибо за помощь.
Является ли этот код: обобщать (group_by (ДФ, г), max.x = тах (х))? –
Спасибо, @Shenglin Chen, но это не соответствует желаемому результату в приведенном выше примере. Это дает мне максимальное значение «x» для каждой группы (возвращает data_frame с 3 строками). Но я хочу, чтобы data_frame с тем же количеством строк, что и входная таблица, где значение в строке 'r' дает максимальное значение' x' в группе 'g', исключая строку' r'. См. «Желаемый результат» выше для конкретного примера. – Eric