Основным решением R является объединение вывода aggregate()
с шагом merge()
. Я нахожу интерфейс формулы для aggregate()
немного более полезным, чем стандартный интерфейс, отчасти потому, что имена в выводе лучше, поэтому я буду использовать это:
Шаг aggregate()
maxs <- aggregate(Score ~ Group, data = dat, FUN = max)
и merge()
шаг просто
merge(maxs, dat)
Это дает нам желаемый результат:
R> maxs <- aggregate(Score ~ Group, data = dat, FUN = max)
R> merge(maxs, dat)
Group Score Info
1 1 3 c
2 2 4 d
Конечно, вы могли бы вставить это в одну строку (промежуточный шаг был больше для экспозиции):
merge(aggregate(Score ~ Group, data = dat, FUN = max), dat)
Основная причина, по которой я использовал интерфейс формулы, заключается в том, что он возвращает фрейм данных с правильным names
для шага объединения; это имена столбцов из исходного набора данных dat
. Нам нужно, чтобы выходные данные aggregate()
имели правильные имена, чтобы merge()
знал, какие столбцы в исходных и агрегированных фреймах данных совпадают.
Стандартный интерфейс дает нечетные имена, как бы вы их ни называли:
R> aggregate(dat$Score, list(dat$Group), max)
Group.1 x
1 1 3
2 2 4
R> with(dat, aggregate(Score, list(Group), max))
Group.1 x
1 1 3
2 2 4
Мы можем использовать merge()
на этих выходах, но нам нужно больше работать, сообщая R, какие столбцы совпадают.