几年前我们发布了 quickpsy 软件包(R 期刊论文中的论文(。该软件包使用了R基函数,但也广泛使用了当时称为Hadleyverse的函数。我们现在正在开发一个新版本的包,它主要使用来自 tidyverse 的函数,并结合了新的非标准评估方法,发现包要慢得多(慢四倍多(。例如,我们发现 purrr::map 比 dplyr::d o(已弃用(慢得多:
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 是否不适合用于这种类型的编程,或者我们没有正确使用它。
如果需要每个组的前两行,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
创建于 2018-10-23 由 reprex 软件包 (v0.2.1.9000(
另请参阅此整洁问题中的基准测试结果
对于这个特定的例子,由nest
和unnest
计算引起的缓慢可以用group_modify
来解决
system.time(
mtcars %>%
group_by(cyl) %>%
group_modify(~head(., 2))
)