使用 tidyr/data.table 复制 data.frames 的 `expand.grid()` 行为
replicate `expand.grid()` behavior with data.frames using tidyr/data.table
我正在尝试加快 base::expand.grid()
功能。我遇到了这个惊人的答案 。但是,我需要的行为依赖于传递给 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()
,当然,同时又不会失去性能提升吗?
提前致谢!
顺便说一句:我已经知道存在:
- Alternative to expand.grid for data.frames
- expand.grid() based on values in two variables in R
尝试tidyr::expand()
tidyr::expand(df,df[,1],df[,2])
试试 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
我正在尝试加快 base::expand.grid()
功能。我遇到了这个惊人的答案 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()
,当然,同时又不会失去性能提升吗?
提前致谢!
顺便说一句:我已经知道存在:
- Alternative to expand.grid for data.frames
- expand.grid() based on values in two variables in R
尝试tidyr::expand()
tidyr::expand(df,df[,1],df[,2])
试试 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