gpt4 book ai didi

r - 如何在 R 中加速 `expand.grid()`?

转载 作者:行者123 更新时间:2023-12-05 04:46:19 28 4
gpt4 key购买 nike

我正在尝试加快创建包含两个向量之间所有可能组合的表格。当我们使用 expand.grid() 时,我们可以从 base R 获得这个功能。但是,我想知道我们是否可以使用 {collapse} 包中的工具更快地完成相同的结果。

关于这个主题有一个 StackOverflow 线程 here .但是,即使我们采用最快的解决方案,但在以下情况下它还是最慢的。尽管 tidyr::expand_grid() 比基础 R 更快,我仍然希望利用 collapse 包我们可以获得更快的处理时间。

#library(collapse)
#library(tidyr)
library(babynames)

year <- collapse::funique(babynames$year, sort = TRUE)
names <- collapse::funique(babynames$name)

expand.grid.jc <- function(seq1,seq2) { ## from https://stackoverflow.com/a/10407457/6105259
as.data.frame(cbind(Var1 = rep.int(seq1, length(seq2)),
Var2 = rep.int(seq2, rep.int(length(seq1),length(seq2)))))
}

my_benchmarking <-
bench::mark(base = expand.grid(year, names),
jc = expand.grid.jc(year, names),
tidyr = tidyr::expand_grid(year, names), check = FALSE, iterations = 10)
#> Warning: Some expressions had a GC in every iteration; so filtering is disabled.

my_benchmarking
#> # A tibble: 3 x 6
#> expression min median `itr/sec` mem_alloc `gc/sec`
#> <bch:expr> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl>
#> 1 base 965.3ms 1.06s 0.938 701MB 2.35
#> 2 jc 13.1s 13.39s 0.0747 820MB 0.120
#> 3 tidyr 541.2ms 656.71ms 1.55 316MB 1.24

reprex package 创建于 2021-08-22 (v2.0.0)

很高兴了解是否可以更快地计算此任务。

最佳答案

你可以试试data.table::CJ函数。

bench::mark(base = expand.grid(year, names),
jc = expand.grid.jc(year, names),
tidyr1 = tidyr::expand_grid(year, names),
tidyr2 = tidyr::crossing(year, names),
dt = data.table::CJ(year, names),
check = FALSE, iterations = 10)

# expression min median `itr/sec` mem_alloc `gc/sec` n_itr n_gc total_time result memory time gc
# <bch:expr> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl> <int> <dbl> <bch:tm> <list> <list> <list> <lis>
#1 base 635.48ms 715.02ms 1.25 699MB 2.00 10 16 8.02s <NULL> <Rprof… <benc… <tib…
#2 jc 5.66s 5.76s 0.172 820MB 0.275 10 16 58.13s <NULL> <Rprof… <benc… <tib…
#3 tidyr1 195.03ms 268.97ms 4.01 308MB 2.00 10 5 2.5s <NULL> <Rprof… <benc… <tib…
#4 tidyr2 590.91ms 748.35ms 1.31 312MB 0.656 10 5 7.62s <NULL> <Rprof… <benc… <tib…
#5 dt 318.1ms 384.21ms 2.47 206MB 0.986 10 4 4.06s <NULL> <Rprof… <benc… <tib…

PS - 还包括 tidyr::crossing 以进行比较,因为它做同样的事情。

关于r - 如何在 R 中加速 `expand.grid()`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68880025/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com