>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)
这可以通过多种方式完成.如果存在"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)
或者我们可以使用ave从base R
Data[with(Data, ave(WK, ID, FUN=max)==WK),]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4527 次 |
| 最近记录: |