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

use*_*490 5 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)
Run Code Online (Sandbox Code Playgroud)

我正在尝试根据"NumSuccesses"中的值创建子集data.frame"Data2",该值对应于"ID"中按"ID"分组的"WK"中的最大值.生成的data.frame应如下所示:

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

akr*_*run 8

这可以通过多种方式完成.如果存在"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
Run Code Online (Sandbox Code Playgroud)

如果每个'ID'的'WK'有一个'max'值,我们可以使用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)
Run Code Online (Sandbox Code Playgroud)

类似的方法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]
Run Code Online (Sandbox Code Playgroud)

或者我们可以使用avebase R

 Data[with(Data, ave(WK, ID, FUN=max)==WK),]
Run Code Online (Sandbox Code Playgroud)