2015-04-12 82 views
5
>ID<-c('A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'C') 
>WK<-c(1, 2, 3, 1, 2, 3, 1, 2, 3, 4, 5) 
>NumSuccess<-c(0, 0, 2, 0, 0, 1, 0, 0, 0, 0, 3) 
>Data<-data.frame(ID, WK, NumSuccess) 

我想創建一個子集,對應於最大價值「NumSuccesses」「基於價值data.frame「數據2」分組WK「按」ID「分組。生成的數據幀應如下所示:[R子集data.frame和另一

>ID<-c('A','B','C') 
>WK<-c(3, 3, 5) 
>NumSuccess<-c(2, 1, 3) 
>Data2<-data.frame(ID, WK, NumSuccess) 

回答

7

這可以通過多種方式完成。如果'WK'的關係,每個'ID'的最大值,並且想要所有具有最大'WK'的行,則在用'ID'分組之後,filter與邏輯條件(WK==max(WK))可能是有用的。

library(dplyr) 
Data %>% 
     group_by(ID) %>% 
     filter(WK==max(WK)) 
# ID WK NumSuccess 
#1 A 3   2 
#2 B 3   1 
#3 C 5   3 

如果沒有爲每「ID」「WK」,我們可以使用which.max,或使用arrange訂購由「WK」數據集爲每個「ID」

Data %>% 
     group_by(ID) %>% 
     slice(which.max(WK)) 
    #  ID WK NumSuccess 
    #1 A 3   2 
    #2 B 3   1 
    #3 C 5   3 

Data %>% 
     group_by(ID) %>% 
     arrange(-WK) %>% 
     slice(1) 
單個「最大」值

data.table類似的方法是

library(data.table) 
setDT(Data)[, .SD[max(WK)==WK], ID] 
setDT(Data)[, .SD[which.max(WK)], ID] 
setkey(setDT(Data), WK)[, .SD[.N], ID] 

或者我們可以使用avebase R

Data[with(Data, ave(WK, ID, FUN=max)==WK),] 
+0

@ user3594490沒問題。很高興它適合你 – akrun