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

B. *_*vis 4 r greatest-n-per-group dplyr

随着dat下面.如何创建包含除每个IndID的前五行之外的所有值的新数据框子集?换句话说,我想要排除每个IndID的前5行的新数据帧.

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

我已经看过一些选择数据的SO帖子,但我不知道如何删除如上所述.

GGa*_*mba 19

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

dat %>% 
    group_by(IndID) %>% 
    slice(6:n())
Run Code Online (Sandbox Code Playgroud)

  • 或者`slice(-1:-5)`,如果你愿意的话 (10认同)

Ric*_*ven 7

在基数R中,tapply()在一系列行号上使用时很方便tail().

idx <- unlist(tapply(1:nrow(dat), dat$IndID, tail, -5))
dat[idx, ]
Run Code Online (Sandbox Code Playgroud)

请注意,这将是更高效的use.names=FALSEunlist().

使用data.table,您可以执行以下操作tail().

library(data.table)

setDT(dat)[dat[, tail(.I, -5), by=IndID]$V1]
Run Code Online (Sandbox Code Playgroud)


Fra*_*ank 6

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

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