Подходы ddply
и ave
, как мне кажется, довольно ресурсоемки. ave
завершается неудачно из-за недостатка памяти для моей текущей проблемы (67 608 строк с четырьмя столбцами, определяющими уникальные ключи). tapply
- это удобный выбор, но мне обычно нужно выбрать все целые строки с чем-то некоторым значением для каждого уникального ключа (обычно определяемого более чем одним столбцом). Лучшее решение, которое я нашел, - это выполнить сортировку, а затем использовать отрицание duplicated
, чтобы выбрать только первую строку для каждого уникального ключа. Для простого примера здесь:
a <- sample(1:10,100,replace=T)
b <- sample(1:100,100,replace=T)
f <- data.frame(a, b)
sorted <- f[order(f$a, -f$b),]
highs <- sorted[!duplicated(sorted$a),]
Я думаю, что увеличение производительности по сравнению с ave
или ddply
, по крайней мере, является существенным. Это несколько сложнее для ключей с несколькими столбцами, но order
будет обрабатывать целую кучу вещей для сортировки, а duplicated
работает с фреймами данных, поэтому можно продолжать использовать этот подход.