【问题标题】:group_by slow when filtering any command过滤任何命令时 group_by 慢
【发布时间】:2019-12-19 19:29:52
【问题描述】:

如果我想group_byfilter 那些在数据集中具有任何NAfactor 值的人,我想在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。没测试过?已测试:仍然需要太多时间。

标签: r dplyr runtime na any


【解决方案1】:

正如@NelsonGon 提到的,anyNA 是在您的情况下使用的功能。

这里已经提到了这个问题:https://stackoverflow.com/a/35713234/10580543

对于二进制示例,any 将在binary == 1 第一次出现时满足,而is.na 将遍历整个向量,这里的长度为2500000

filter(anyNA(narow)) 应该比filter(any(is.na(narow)) 快很多

编辑:实际上,factor 的时间增益非常有限(快 4%)。

但是,将factor 转换为character 会使过滤速度非常快(大约快100 倍)。如果您有兴趣,请在此处解释“为什么”:https://stackoverflow.com/a/34865113/10580543

如果您对排序级别不感兴趣,则通常首选使用字符而不是因子来表示分类变量,而且效率更高。

【讨论】:

  • 但这和我想的一样慢吗? (12.55 秒)我已经编辑了我的问题 - 似乎 any 提取 factor 的速度也一样慢?
  • 感谢您的链接。所以,我的问题的答案是这个速度是可以预料的,没有更快的方法来使用any?有趣!
  • @user63230 最快的方法是对字符向量进行过滤,对于这一步的数据管理,您无论如何都不需要将它们作为因素。您仍然可以稍后将它们转换回因子。
猜你喜欢
  • 1970-01-01
  • 2020-05-10
  • 2015-08-17
  • 1970-01-01
  • 1970-01-01
  • 2018-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多