>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)
答案 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),]