使用tidyverse进行编程:速度问题

时间:2018-10-01 13:03:11

标签: r tidyverse purrr nse

几年前(quickpsy)我们发布了软件包paper in the R journal paper。该软件包使用了R基本功能,但也广泛使用了当时称为Hadleyverse的功能。我们现在正在开发该软件包的new version,该软件包主要使用tidyverse中的函数,并结合了the new non-standard evaluation approach,发现该软件包要慢得多(慢四倍)。例如,我们发现purrr :: map比dplyr :: do(已弃用)慢得多:

library(tidyverse)

system.time(
  mtcars %>% 
    group_by(cyl) %>% 
    do(head(., 2))
  )

system.time(
  mtcars %>% 
    group_by(cyl) %>% 
    nest() %>% 
    mutate(temp = map(data, ~head(., 2))) %>% 
    unnest(temp)
)

我们还发现pull之类的功能非常慢。

我们不确定tidyverse是否不打算用于这种类型的编程,或者我们没有正确使用它。

2 个答案:

答案 0 :(得分:3)

如果要每个组的前两行,

slice()是合适的工具。 do()nest() %>% mutate(map()) %>% unnest()都太重,占用更多内存:

library(dplyr, warn.conflicts = FALSE)
library(tidyr)
library(purrr)

library(tidyverse)

system.time(
  mtcars %>% 
    group_by(cyl) %>% 
    do(head(., 2))
)
#>    user  system elapsed 
#>   0.065   0.003   0.075

system.time(
  mtcars %>% 
    group_by(cyl) %>% 
    nest() %>% 
    mutate(temp = map(data, ~head(., 2))) %>% 
    unnest(temp)
)
#>    user  system elapsed 
#>   0.024   0.000   0.024

system.time(
  mtcars %>% 
    group_by(cyl) %>% 
    slice(1:2)
)
#>    user  system elapsed 
#>   0.002   0.000   0.002

reprex package(v0.2.1.9000)于2018-10-23创建

另请参阅此tidyr issue

中的基准测试结果

答案 1 :(得分:0)

对于此特定示例,可以使用nest开发版本中的unnest来解决group_mapdplyr计算引起的缓慢性

system.time(
   mtcars %>% 
   group_by(cyl) %>% 
   group_map(~head(., 2))
)