假设我有一个由分类变量和数字变量组成的数据框。
df <- data.frame(group=c(1,1,1,1,1,2,2,2,2,2),days=floor(runif(10, min=0, max=101)))
df
group days
1 1 54
2 1 61
3 1 31
4 1 52
5 1 21
6 2 22
7 2 18
8 2 50
9 2 46
10 2 35
我想选择与组相关的最大天数以及所有以下/后续组行的行。对于上面的示例,我的子集df2应如下所示:
df2
group days
2 1 61
3 1 31
4 1 52
5 1 21
8 2 50
9 2 46
10 2 35
请注意,这些群组可能有不同的长度。
答案 0 :(得分:3)
对于基本R解决方案,使用保持索引大于或等于最大值的元素的函数按组聚合天数,然后重新整形为长数据。框架
df0 = aggregate(days ~ group, df, function(x) x[seq_along(x) >= which.max(x)])
data.frame(group=rep(df0$group, lengths(df0$days)),
days=unlist(df0$days, use.names=FALSE)))
导致
group days
1 1 84
2 1 31
3 1 65
4 1 23
5 2 94
6 2 69
7 2 45
答案 1 :(得分:2)
您可以使用which.max
找出days
的最大值索引,然后使用slice
中的dplyr
来选择之后的所有行,其中{ {1}}给出每组中的行数:
n()
library(dplyr)
df %>% group_by(group) %>% slice(which.max(days):n())
#Source: local data frame [7 x 2]
#Groups: group [2]
# group days
# <int> <int>
#1 1 61
#2 1 31
#3 1 52
#4 1 21
#5 2 50
#6 2 46
#7 2 35
语法类似,data.table
与.N
中的n()
类似,并给出每组中的行数:
dplyr
答案 2 :(得分:0)
我们可以在data.table
使用更快的选项,我们在其中找到行索引(.I
),然后根据该行对其进行子集化。
library(data.table)
setDT(df)[df[ , .I[which.max(days):.N], by = group]$V1]
# group days
#1: 1 61
#2: 1 31
#3: 1 52
#4: 1 21
#5: 2 50
#6: 2 46
#7: 2 35