Сворачивание кадра данных путем выбора одной строки на группу

Я пытаюсь свернуть кадр данных путем удаления всех кроме одной строки от каждой группы строк с идентичными значениями в конкретном столбце. Другими словами, первая строка от каждой группы.

Например, я хотел бы преобразовать это

> 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]})

Я попробовал, разделял/не разделял с тем же аргументом функции, как здесь, но неразделенный жалуется на числа дублирующейся строки.

Действительно ли rle является возможностью? Существует ли идиома R для преобразования вектора длины rle в индексы строк, которые запускают каждое выполнение, которое я могу затем использовать для щипания тех строк из кадра данных?

20
задан jogo 23 January 2016 в 10:35
поделиться

2 ответа

Может быть, duplicated () может помочь:

R> d[ !duplicated(d$x), ]
  x  y  z
1 1 10 20
3 2 12 18
4 4 13 17
R> 

Edit Черт, ничего. Это выбирает первое в каждом блоке повторений, а вы хотели последнее. Итак, вот еще одна попытка использования plyr :

R> ddply(d, "x", function(z) tail(z,1))
  x  y  z
1 1 11 19
2 2 12 18
3 4 13 17
R> 

Здесь plyr выполняет тяжелую работу по поиску уникальных подмножеств, перебирая их и применяя предоставленную функцию, которая просто возвращает последний набор наблюдений в блоке z с использованием tail (z, 1) .

28
ответ дан 29 November 2019 в 23:08
поделиться

Просто добавлю немного к тому, что предоставил Дирк... duplicated имеет аргумент fromLast, который можно использовать для выбора последней строки:

d[ !duplicated(d$x,fromLast=TRUE), ]
13
ответ дан 29 November 2019 в 23:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: