【发布时间】:2016-01-16 18:08:30
【问题描述】:
观察不足时如何删除组?
在以下可重现的示例中,每个人(由 name 标识)有 10 个观察值:
install.packages('randomNames') # install package if required
install.packages('data.table') # install package if required
lapply(c('data.table', 'randomNames'), require, character.only = TRUE) # load packages
set.seed(1)
testDT <- data.table( date = rep(seq(as.Date("2010/1/1"), as.Date("2019/1/1"), "years"),10),
name = rep(randomNames(10, which.names='first'), times=1, each=10),
Y = runif(100, 5, 15),
X = rnorm(100, 2, 9),
testDT <- testDT[ X > 0]
现在我只想保留至少有 6 个观察值的人,因此必须删除 Gracelline、Anna、Aesha 和 Michael,因为他们有 分别只有 3、2、4 和 5 个观察值。
testDT[, length(X), by=name]
name V1
1: Blake 6
2: Alexander 6
3: Leigha 8
4: Gracelline 3
5: Epifanio 7
6: Keasha 6
7: Robyn 6
8: Anna 2
9: Aesha 4
10: Michael 5
如何以自动方式执行此操作(实际数据集要大得多)?
编辑:
是的,它是重复的。 :( 最后提出的方法是最快的。
> system.time(testDT[, .SD[.N>=6], by = name])
user system elapsed
0.293 0.227 0.517
> system.time(testDT[testDT[, .I[.N>=6], by = name]$V1])
user system elapsed
0.163 0.243 0.415
> system.time(testDT[,if(.N>=6) .SD , by = name])
user system elapsed
0.073 0.323 0.399
【问题讨论】:
标签: r data.table