从 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 帖子,但我不确定如何删除上述内容。
我们可以使用 dplyr
的 slice()
功能:
dat %>%
group_by(IndID) %>%
slice(6:n())
您可以使用基数 R
的 split
将 dat
拆分为 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), ]
与下面的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 帖子,但我不确定如何删除上述内容。
我们可以使用 dplyr
的 slice()
功能:
dat %>%
group_by(IndID) %>%
slice(6:n())
您可以使用基数 R
的 split
将 dat
拆分为 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), ]