【发布时间】:2019-12-19 19:29:52
【问题描述】:
如果我想group_by 和filter 那些在数据集中具有任何NA 或factor 值的人,我想在dplyr 中使用any 函数但发现运行@987654327 很慢@ 或 factor(但不用于查找任何数值)。示例数据:
library(tidyverse)
set.seed(10)
df <- data.frame( group = rep((paste("g", seq(1, 50000, 1), sep = "" )), each =500, length.out = 2500000),
binary = rbinom(2500000, 1, 0.5),
narow = rep(letters[1:26], each = 2, length.out = 2500000))
df <- df %>%
dplyr::mutate(narow = replace(narow, row_number() == 345 | row_number() == 77777, NA) )
str(df)
#'data.frame': 2500000 obs. of 3 variables:
#$ group : Factor w/ 5000 levels "g1","g10","g100",..: 1 1 1 1 1 1 1 1 1 1 ...
#$ binary: int 1 0 0 1 0 0 0 0 1 0 ...
#$ narow : Factor w/ 26 levels "a","b","c","d",..: 1 1 2 2 3 3 4 4 5 5 ...
现在让group_by 使用any binary==1 提取这些组:
system.time(
dfnew <- df %>%
group_by(group) %>%
filter(any(binary == 1))
)
# user system elapsed
# 0.1 0.0 0.1
这运行很快,但是当我为查找任何NAs 做同样的事情时,它非常慢(我有一个更大的数据集):
system.time(
dfnew <- df %>%
group_by(group) %>%
filter(any(is.na(narow)))
)
# user system elapsed
# 5.25 8.49 13.75
考虑到对于之前非常相似的代码(1 vs 13.75s)来说它很快,这似乎非常慢。这是可以预料的还是我做错了什么?我想继续使用any 功能,因为我觉得它很直观。
编辑
似乎不仅仅是NAs。如果我 filter any 因子变量,我的反应也会很慢:
system.time(
dfnew <- df %>%
group_by(group) %>%
filter(any(narow == "a"))
)
user system elapsed
5.32 7.45 12.83
【问题讨论】:
-
也许可以试试
anyNA。没测试过?已测试:仍然需要太多时间。