2015-04-12 85 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