使用 tidyr/data.table 与 data.frames 复制 `expand.grid()` 行为

标签 r dataframe data.table tidyverse combinations

我正在尝试加快 base::expand.grid() 函数的速度。我发现了这个惊人的答案How to speed up `expand.grid()` in R? 。但是,我需要的行为依赖于传递给 base::expand.grid() 函数的data.frame,但不幸的是,建议的(更快的)函数在接收 data.frames 时的行为略有不同。例如,这就是我需要的行为。

x  <- c(.3,.6)
df <- as.data.frame(rbind(x, 1 - x))
df
##   V1  V2
## x 0.3 0.6
##   0.7 0.4
 
(base::expand.grid(df))
##   V1  V2
## 1 0.3 0.6
## 2 0.7 0.6
## 3 0.3 0.4
## 4 0.7 0.4

但是,这就是我从更快的函数中得到的结果:

library(tidyr)
library(data.table)
(tidyr::expand_grid(df))
## # A tibble: 2 × 2
##       V1    V2
## <dbl> <dbl>
##   1   0.3   0.6
##   2   0.7   0.4
##  
(tidyr::crossing(df))
# A tibble: 2 × 2
##       V1    V2
## <dbl> <dbl>
##   1   0.3   0.6
##   2   0.7   0.4

(as_tibble(data.table::CJ(df,sorted = FALSE)))
## # A tibble: 2 × 1
##       df$``   $``
## <dbl> <dbl>
##   1   0.3   0.6
##   2   0.7   0.4

你知道我如何在接收到 data.frame 时将所述函数调整为类似于 base::expand.grid() ,当然,同时又不会失去性能提升?

提前谢谢您!


顺便说一句:我已经知道以下内容的存在:

最佳答案

尝试使用do.call

> do.call(tidyr::expand_grid, df)
# A tibble: 4 x 2
     V1    V2
  <dbl> <dbl>
1   0.3   0.6
2   0.3   0.4
3   0.7   0.6
4   0.7   0.4

> do.call(tidyr::crossing, df)
# A tibble: 4 x 2
     V1    V2
  <dbl> <dbl>
1   0.3   0.4
2   0.3   0.6
3   0.7   0.4
4   0.7   0.6

> do.call(data.table::CJ, df)
    V1  V2
1: 0.3 0.4
2: 0.3 0.6
3: 0.7 0.4
4: 0.7 0.6

关于使用 tidyr/data.table 与 data.frames 复制 `expand.grid()` 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72490291/

相关文章:

python - Pandas:如何将具有重复索引值的数据帧转换为字典

xml - 将缺少元素的 XML 解析并转换为表结构

regex - R中的Excel RegEx函数

r - 如何将矩阵子集化为一列,维护矩阵数据类型,维护行/列名称?

r - 从 R 中的 "key"获取 "value"

r - 根据一个数据框中其他值的总和计算一个值

python - 如何在 sckikit-learn 中将数据帧列的分类值转换为 one-hot 编码列?

r - 如何在R中将文本文件转换为数据帧?

r - 数据表元编程

R-加速与 data.table 子集相关的计算