r - 使用outer代替expand.grid

标签 r

我正在寻找尽可能快的速度,并留在基地做 expand.grid 所做的事情。我过去曾使用 outer 来实现类似的目的来创建向量;像这样的东西:

v <- outer(letters, LETTERS, paste0)
unlist(v[lower.tri(v)])

基准测试表明 outer 可以比 expand.grid 快得多,但这次我想创建两列,就像 expand.grid (2 个向量的所有可能组合),但是我使用 outer 的方法这次没有使用outer 进行基准测试那么快。

我希望采用 2 个向量并尽快将每个可能的组合创建为两列(我认为 outer 可能是路线,但对任何基本方法都持开放态度。

这是 expand.grid 方法和 outer 方法。

dat <- cbind(mtcars, mtcars, mtcars)

expand.grid(seq_len(nrow(dat)), seq_len(ncol(dat)))

FOO <- function(x, y) paste(x, y, sep=":")
x <- outer(seq_len(nrow(dat)), seq_len(ncol(dat)), FOO)
apply(do.call("rbind", strsplit(x, ":")), 2, as.integer)

微基准测试显示outer速度较慢:

#     expr      min        lq    median        uq      max
# EXPAND.G  812.743  838.6375  894.6245  927.7505 27029.54
#    OUTER 5107.871 5198.3835 5329.4860 5605.2215 27559.08

我认为我的 outer 使用速度很慢,因为我不知道如何使用 outer 直接创建我可以 do.call 的长度为 2 的向量('rbind' 在一起。我必须减慢 paste 和减慢分割速度。我如何使用 outer (或 base< 中的其他方法)来做到这一点)以比扩展网格更快的方式?

编辑: 添加微基准测试结果。

**

Unit: microseconds
      expr     min       lq  median      uq       max
1   ERNEST  34.993  39.1920  52.255  57.854 29170.705
2     JOHN  13.997  16.3300  19.130  23.329   266.872
3 ORIGINAL 352.720 372.7815 392.377 418.738 36519.952
4    TOMMY  16.330  19.5960  23.795  27.061  6217.374
5  VINCENT 377.447 400.3090 418.505 451.864 43567.334

**

enter image description here

最佳答案

rep.int 的文档并不完整。它不仅在最常见的情况下速度最快,因为您可以为 times 参数传递向量,就像使用 rep 一样。您可以直接将它用于两个序列,比 Tommy 的时间又减少了 40% 左右。

expand.grid.jc <- function(seq1,seq2) {
    cbind(Var1 = rep.int(seq1, length(seq2)), 
    Var2 = rep.int(seq2, rep.int(length(seq1),length(seq2))))
}

关于r - 使用outer代替expand.grid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10405637/

相关文章:

R - 如何将向量连接成字符串?

r - charToRaw 的矢量化版本,具有良好的性能

r - 如何在 R 的函数调用中包含变量名称?

r - 计算数据集列的百分位数

class - 从 S4 类定义中的包中识别 S3 (?) 类

r - 使用 docker 文件安装 R 包

r - 如何根据组内的子字符串匹配两个数据框

r - 需要在 R 中绘制具有标准误差的曲线

循环中重复值,直到错误消失

r - 如何在 R 中的布局内调整单个绘图的边距?