Я пытаюсь свернуть фрейм данных, удалив все строки, кроме одной, из каждой группы строк с одинаковыми значениями в определенном столбце. Другими словами, первый ряд от каждой группы.
Например, я хотел бы преобразовать это
> d = data.frame(x=c(1,1,2,4),y=c(10,11,12,13),z=c(20,19,18,17))
> d
x y z
1 1 10 20
2 1 11 19
3 2 12 18
4 4 13 17
В это:
x y z
1 1 11 19
2 2 12 18
3 4 13 17
Я использую агрегат, чтобы сделать это в настоящее время, но производительность недопустима с большим количеством данных:
> d.ordered = d[order(-d$y),]
> aggregate(d.ordered,by=list(key=d.ordered$x),FUN=function(x){x[1]})
Я пробовал split / unsplit с тем же аргументом функции, что и здесь, но unsplit жалуется на повторяющиеся номера строк.
Есть ли возможность? Существует ли R-идиома для преобразования вектора длины rle в индексы строк, начинающих каждый прогон, который я затем могу использовать для извлечения этих строк из фрейма данных?