在 R 中组合所有可能的数据框行
Combine all possible rows of data frame in R
我有以下数据框:
x <- data.frame("Col1" = c('A', 'B', 'C', 'D'), "Col2" = c('W', 'X', 'Y', 'Z'))
我想要一个新的数据框,其中包含所有可能的行组合组合,这将提供一个包含两列的数据框,其中包含如下内容:
A W
A X
A Y
A Z
B W
B X
B Y
B Z
C W
...
数据框总是有两列,但行数可能会有所不同。
我查看了 permute() 或 sample() 但我没有找到我要找的东西。
谢谢!
tidyr::complete()
就是为此设计的。我很惊讶我没有在 SO 上看到普通示例。
library(magrittr)
x %>%
tidyr::complete(Col1, Col2)
结果:
# A tibble: 16 x 2
Col1 Col2
<fct> <fct>
1 A W
2 A X
3 A Y
4 A Z
5 B W
6 B X
7 B Y
8 B Z
9 C W
10 C X
11 C Y
12 C Z
13 D W
14 D X
15 D Y
16 D Z
如果您的真实场景与 OP 一样简单,@bouncyball 对 expand.grid(x)
的建议是最干净的。如果您的真实场景更复杂,那么 tidyr::complete()
可能会让您更轻松地成长。我一般有两个以上的ID变量到expand/complete。这些通常是分析的 dependent/outcome 变量,fill
参数允许您为观察数据集中未出现的组合指定默认值。这是 .
编辑以反映@bouncyball 和@ADuv 的建议。
关于 tidyr::complete
与 base::expand.grid
,性能也可能是一个因素。
根据下面的基准测试,complete
速度要慢得多,尽管差异会随着输入大小的增加而减小。
df <- data.frame(a= 1:10,b= 1:10)
# microbenchmark(complete(df,a,b), expand.grid(df))
# Unit: microseconds
# expr min lq mean median uq max neval
# complete(df, a, b) 15345.348 16065.27 17947.2132 16609.512 17351.317 46415.772 100
# expand.grid(df) 129.194 144.74 174.8799 194.395 201.337 256.577 100
df <- data.frame(a= 1:100,b= 1:100)
# microbenchmark(complete(df,a,b), expand.grid(df))
# Unit: microseconds
# expr min lq mean median uq max neval
# complete(df, a, b) 15992.523 16380.1030 17743.4860 16611.4730 16998.149 26622.31 100
# expand.grid(df) 323.588 340.4925 376.6481 383.6575 397.844 665.89 100
df <- data.frame(a= 1:1000,b= 1:1000)
microbenchmark(complete(df,a,b), expand.grid(df))
# Unit: milliseconds
# expr min lq mean median uq max neval
# complete(df, a, b) 86.58981 88.49813 98.73944 93.62617 98.83436 157.40141 100
# expand.grid(df) 18.99899 19.40211 21.83331 21.20161 23.71123 33.19729 100
我有以下数据框:
x <- data.frame("Col1" = c('A', 'B', 'C', 'D'), "Col2" = c('W', 'X', 'Y', 'Z'))
我想要一个新的数据框,其中包含所有可能的行组合组合,这将提供一个包含两列的数据框,其中包含如下内容:
A W
A X
A Y
A Z
B W
B X
B Y
B Z
C W
...
数据框总是有两列,但行数可能会有所不同。
我查看了 permute() 或 sample() 但我没有找到我要找的东西。 谢谢!
tidyr::complete()
就是为此设计的。我很惊讶我没有在 SO 上看到普通示例。
library(magrittr)
x %>%
tidyr::complete(Col1, Col2)
结果:
# A tibble: 16 x 2
Col1 Col2
<fct> <fct>
1 A W
2 A X
3 A Y
4 A Z
5 B W
6 B X
7 B Y
8 B Z
9 C W
10 C X
11 C Y
12 C Z
13 D W
14 D X
15 D Y
16 D Z
如果您的真实场景与 OP 一样简单,@bouncyball 对 expand.grid(x)
的建议是最干净的。如果您的真实场景更复杂,那么 tidyr::complete()
可能会让您更轻松地成长。我一般有两个以上的ID变量到expand/complete。这些通常是分析的 dependent/outcome 变量,fill
参数允许您为观察数据集中未出现的组合指定默认值。这是
编辑以反映@bouncyball 和@ADuv 的建议。
关于 tidyr::complete
与 base::expand.grid
,性能也可能是一个因素。
根据下面的基准测试,complete
速度要慢得多,尽管差异会随着输入大小的增加而减小。
df <- data.frame(a= 1:10,b= 1:10)
# microbenchmark(complete(df,a,b), expand.grid(df))
# Unit: microseconds
# expr min lq mean median uq max neval
# complete(df, a, b) 15345.348 16065.27 17947.2132 16609.512 17351.317 46415.772 100
# expand.grid(df) 129.194 144.74 174.8799 194.395 201.337 256.577 100
df <- data.frame(a= 1:100,b= 1:100)
# microbenchmark(complete(df,a,b), expand.grid(df))
# Unit: microseconds
# expr min lq mean median uq max neval
# complete(df, a, b) 15992.523 16380.1030 17743.4860 16611.4730 16998.149 26622.31 100
# expand.grid(df) 323.588 340.4925 376.6481 383.6575 397.844 665.89 100
df <- data.frame(a= 1:1000,b= 1:1000)
microbenchmark(complete(df,a,b), expand.grid(df))
# Unit: milliseconds
# expr min lq mean median uq max neval
# complete(df, a, b) 86.58981 88.49813 98.73944 93.62617 98.83436 157.40141 100
# expand.grid(df) 18.99899 19.40211 21.83331 21.20161 23.71123 33.19729 100