从r data.frame

时间:2017-02-14 23:12:41

标签: r dplyr greatest-n-per-group

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

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

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

4 个答案:

答案 0 :(得分:17)

我们可以使用dplyr的{​​{1}}功能:

slice()

答案 1 :(得分:7)

在基数R中,tapply()tail()的行号序列上使用时非常方便。

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

请注意,use.names=FALSE中的unlist()可以提高效率。

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

library(data.table)

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

答案 2 :(得分:6)

如果对数据进行了排序,并确保每个组至少有n行......

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

答案 3 :(得分:3)

您可以使用基础boxes = Tree() boxes['boxes'][5]['provider']= box.provider 的{​​{1}}将split拆分为R,删除每个子组的前5行,然后dat之后。

IndID