在R中按组删除数据尾部
Delete tail of data by group in R
我有一个类似于
的数据框
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 组修剪最后两行。
使用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
这里有一个使用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
尝试拉取组内的第一个值:
x<-do.call("rbind", lapply(split(df, df$group), function(d) head(d,-d$trim[1]) ) )
通常我会测试我的答案,但在 iPhone 的弹跳火车上进行测试。
我有一个类似于
的数据框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 组修剪最后两行。
使用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
这里有一个使用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
尝试拉取组内的第一个值:
x<-do.call("rbind", lapply(split(df, df$group), function(d) head(d,-d$trim[1]) ) )
通常我会测试我的答案,但在 iPhone 的弹跳火车上进行测试。