【发布时间】:2017-08-23 22:26:28
【问题描述】:
过滤 data.frame 以仅获取大小为 5 的组的最佳方法是什么?
所以我的数据如下:
require(dplyr)
n <- 1e5
x <- rnorm(n)
# Category size ranging each from 1 to 5
cat <- rep(seq_len(n/3), sample(1:5, n/3, replace = TRUE))[1:n]
dat <- data.frame(x = x, cat = cat)
我能想到的 dplyr 方法是
dat <- group_by(dat, cat)
system.time({
out1 <- dat %>% filter(n() == 5L)
})
# user system elapsed
# 1.157 0.218 1.497
但这很慢……在 dplyr 中有没有更好的方法?
到目前为止,我的解决方法如下:
system.time({
all_ind <- rep(seq_len(n_groups(dat)), group_size(dat))
take_only <- which(group_size(dat) == 5L)
out2 <- dat[all_ind %in% take_only, ]
})
# user system elapsed
# 0.026 0.008 0.036
all.equal(out1, out2) # TRUE
但这并不像 dplyr 那样......
【问题讨论】:
-
等到你看到 data.table 解决方案。根本不是 dplyery。
-
也很简单。类似
setDT(dat)[, if(.N == 5) .SD, by = cat] -
data.table 中更快的方法是
setDT(dat)[dat[, .I[.N==5], by = cat]$V1] -
@ChirayuChamoli:猜你的意思是
m:是的,它已被订购。 -
@ChirayuChamoli:很好的答案。刚刚在下面添加了
标签: r dataframe filter dplyr subset