R子集data.frame从一个向量的最大值开始并按另一个向量分组

时间:2015-04-12 05:44:57

标签: r subset

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

我正在尝试创建子集data.frame&#34; Data2&#34;基于&#34; NumSuccesses&#34;中的值这对应于&#34; WK&#34;中的最大值。按&#34; ID&#34;分组。生成的data.frame应如下所示:

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

1 个答案:

答案 0 :(得分:8)

这可以通过多种方式完成。如果有WK&#39;的关联,则每个ID&#39;的最大值。并且希望所有行都具有最大&#39; WK&#39;,filter使用逻辑条件(WK==max(WK))后,通过&#39; ID&#39;进行分组可能会有用。 。

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

如果有一个&#39; max&#39; WK&#39;的价值根据&#39; ID,我们可以使用which.max或使用arrange按“WK”排序数据集。对于每个ID&#39;

  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]

或者我们可以使用ave

中的base R
 Data[with(Data, ave(WK, ID, FUN=max)==WK),]