r语言 - 使用 tidyr/data.table 将 'expand.grid()' 行为与 data.frame 复制



我正在尝试加快base::expand.grid()功能。我遇到了这个惊人的答案如何在R中加速"expand.grid()"?但是,我需要的行为依赖于传递给base::expand.grid()函数的data.frame,但不幸的是,建议的(更快的)函数在接收 data.frame 时的行为略有不同。例如,这是我需要的行为。

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(),当然,而不会失去性能的提高吗?

提前谢谢你!


顺便说一句:我已经知道存在:

  • 用于数据帧的 expand.grid 的替代方案
  • expand.grid() 基于 R 中两个变量中的值

尝试使用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::expand()

tidyr::expand(df,df[,1],df[,2])

相关内容

  • 没有找到相关文章

最新更新