2013-07-09 2 views
1

У меня такой набора данных (ID, V1, V2 являются 3 переменными моим кадром данных):Обобщить кадр данных на основе состояния

ID V1 V2 
1 A 10 
1 B 5 
1 D 1 
2 C 9 
2 E 8 

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

ID V1 V2 
1 A 10 
2 C 9 
+0

насчет случаи, когда есть связи для «макс»? – A5C1D2H2I1M1N2O1R2T1

+0

В моем случае невозможно – DJack

+2

Если вас интересует решение 'data.table', то:' dt [dt [, .I [who.max (V2)], by = ID] $ V1] ' – Arun

ответ

1

Это своего рода неуклюжим кода, но это работает ....

> mydf[with(mydf, ave(V2, ID, FUN = function(x) x == max(x))) == 1, ] 
    ID V1 V2 
1 1 A 10 
4 2 C 9 

Менее неуклюжий:

do.call(rbind, 
     by(mydf, mydf$ID, 
      FUN = function(x) x[which.max(x$V2), ])) 
# ID V1 V2 
# 1 1 A 10 
# 2 2 C 9 
+0

Быстро! Отлично. спасибо – DJack

2

ddply Использование пакета из plyr (предположим, что данные есть образец)

library(plyr) 
    ddply(sample,.(ID),summarize,V1=V1[which.max(V2)],V2=max(V2)) 

    ID V1 V2 
1 1 A 10 
2 2 C 9 
Смежные вопросы