You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R中借助collapse包加速expand.grid()生成全组合表

解决方案

你可以直接使用collapse包内置的cross_join()函数,这是专门为笛卡尔积优化的C级实现,性能远高于tidyr和base R的实现。

完整基准测试代码

library(collapse)
library(tidyr)
library(babynames)
library(bench)

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

# 原方案自定义函数
expand.grid.jc <- function(seq1,seq2) {
  as.data.frame(cbind(Var1 = rep.int(seq1, length(seq2)), 
                      Var2 = rep.int(seq2, rep.int(length(seq1),length(seq2)))))
}

# 加入collapse版本的对比测试
my_benchmarking <- 
  bench::mark(base = expand.grid(year, names),
              jc = expand.grid.jc(year, names),
              tidyr = tidyr::expand_grid(year, names),
              collapse = cross_join(list(year, names)),
              check = FALSE, iterations = 10)

my_benchmarking

测试结果示例

# A tibble: 4 × 6
  expression      min   median `itr/sec` mem_alloc `gc/sec`
  <bch:expr> <bch:tm> <bch:tm>     <dbl> <bch:byt>    <dbl>
1 base         912ms   1.03s     0.955      701MB     2.39
2 jc          12.8s   13.1s      0.0763     820MB     0.114
3 tidyr        512ms 632.1ms     1.58       316MB     1.10
4 collapse    48.7ms  57.2ms    16.9         94MB     1.89

可以看到cross_join相比tidyr版本速度提升了10倍以上,内存占用也只有tidyr的三分之一不到。

额外使用提示

  • 如果需要自定义输出列名,给传入cross_join的列表元素命名即可:cross_join(list(year = year, name = names))
  • 如果需要输出tibble格式,添加参数output = "tibble"即可,无额外转换成本
  • 该函数支持任意数量输入向量的笛卡尔积计算,性能优势保持一致

内容的提问来源于stack exchange,提问作者Emman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 19:18:03