R 子集 data.frame 来自一个向量的最大值并由另一个向量分组

R Subset data.frame from max value of one vector and grouped by another

>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 "Data2",该子集对应于按 [=18= 分组的 "WK" 中的最大值].结果 data.frame 应如下所示:

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

这可以通过不止一种方式完成。如果 'WK'、每个 'ID' 的最大值并希望所有行具有最大值 'WK',则 filter 与逻辑条件 (WK==max(WK)) 按 'ID' 分组后。

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

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]

或者我们可以使用 base R

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