在R中按组删除数据尾部

时间:2016-06-10 17:44:53

标签: r lapply head

我的数据框类似于

df <- data.frame(group=c("a", "b"), value=1:16,trim=rep(1:2))

我想知道如何删除每个组的最后一行。要从每个组中删除的行数在“trim”变量中定义 我已经找到了如何使用

从所有组中删除指定数量的行
x<-do.call("rbind", lapply(split(df, df$group), head,-2))

但是,我似乎无法弄清楚如何从“trim”列中指定的组中删除行数。换句话说,我希望将a组分组以修剪最后一行,将b组修剪为最后2行。

3 个答案:

答案 0 :(得分:5)

尝试在组内提取第一个值:

x<-do.call("rbind", lapply(split(df, df$group), function(d) head(d,-d$trim[1]) ) )

通常我会测试我的答案,但是在弹跳的火车上通过iPhone进行测试。

答案 1 :(得分:2)

使用dplyr

library(dplyr)

df %>% group_by(group) %>% slice(1:(n() - trim[1]))  # Per @42-, this is faster than unique(trim)
    group value  trim
1       a     1     1
2       a     3     1
3       a     5     1
4       a     7     1
5       a     9     1
6       a    11     1
7       a    13     1
8       b     2     2
9       b     4     2
10      b     6     2
11      b     8     2
12      b    10     2
13      b    12     2

答案 2 :(得分:2)

这是一个使用data.table的方法(借用@ 42的方法):

library(data.table)
setDT(df)
df[, head(.SD, -trim[1]), by=group]

哪个输出:

    group value trim
 1:     a     1    1
 2:     a     3    1
 3:     a     5    1
 4:     a     7    1
 5:     a     9    1
 6:     a    11    1
 7:     a    13    1
 8:     b     2    2
 9:     b     4    2
10:     b     6    2
11:     b     8    2
12:     b    10    2
13:     b    12    2