几年前(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是否不打算用于这种类型的编程,或者我们没有正确使用它。
答案 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_map
和dplyr
计算引起的缓慢性
system.time(
mtcars %>%
group_by(cyl) %>%
group_map(~head(., 2))
)