按组选择行会议条件和所有后续行

时间:2016-08-01 23:56:42

标签: r

假设我有一个由分类变量和数字变量组成的数据框。

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

请注意,这些群组可能有不同的长度。

3 个答案:

答案 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