从 r data.frame 中的每个因子水平中删除前 N 行

Remove the first N rows from each factor level in an r data.frame

与下面的dat。如何创建一个新的数据框子集,其中包含除每个 IndID 的前五行以外的所有值?换句话说,我想要新的数据框,每个 IndID 的前 5 行都被排除在外。

set.seed(123)
dat <- data.frame(IndID = rep(c("AAA", "BBB", "CCC", "DDD"), each  = 10),
                  Number = sample(1:100,40))

我看过一些 select 数据的 SO 帖子,但我不确定如何删除上述内容。

我们可以使用 dplyrslice() 功能:

dat %>% 
    group_by(IndID) %>% 
    slice(6:n())

您可以使用基数 Rsplitdat 拆分为 IndID,删除每个 sub-group 的前 5 行,然后 rbind 在那之后。

do.call(rbind, lapply(split(dat,as.character(dat$IndID)), function(x) x[-(1:5),]))

在 base R 中,tapply() 用于带有 tail() 的行号序列时很方便。

idx <- unlist(tapply(1:nrow(dat), dat$IndID, tail, -5))
dat[idx, ]

请注意,unlist() 中的 use.names=FALSE 会更有效。

使用 data.table,您可以使用 tail().

执行以下操作
library(data.table)

setDT(dat)[dat[, tail(.I, -5), by=IndID]$V1]

如果数据已排序并且保证每组至少有 n 行...

n = 5
w = match(unique(dat$IndID), dat$IndID)
dat[- (rep(w, each = n) + 1:n - 1L), ]