R中将笛卡尔积转换为多列

joh*_*111 3 r cartesian-product

假设一个简单的数据集,如:

col  data
0    A
0    B
0    C
1    D
1    E
1    F
2    G
2    H
2    I
Run Code Online (Sandbox Code Playgroud)

...目标是将其转换为由"col"中的不同值的数量给出的多个列,并且在每列中,由该列的关联"数据"指定的值...然后呈现所有内容作为一种笛卡尔积(其中列不应混合在一起):

0  1  2 (column names)
A  D  G
A  D  H
A  D  I
A  E  G
A  E  H
A  E  I
A  F  G
A  F  H
A  F  I
B  D  G
B  D  H
B  D  I
(etc...)
Run Code Online (Sandbox Code Playgroud)

我已经把它搞砸了一下,dcast(df, data ~ col)让我开始生成正确数量的列,但我仍然需要从那里到各种列的交叉积,每列中的值.最后要注意的是,这里的列数并不固有:任何解决方案必须适用于原始数据中指定的许多列.

ali*_*ire 6

expand.grid"从所提供的矢量或因子的所有组合中创建一个数据框",这是一种长版本outer的笛卡尔积.它需要一组向量/因子或包含这样的列表,这让我们简单地split data通过col:

expand.grid(split(df$data, df$col))

#    0 1 2
# 1  A D G
# 2  B D G
# 3  C D G
# 4  A E G
# 5  B E G
# 6  C E G
# 7  A F G
# 8  B F G
# 9  C F G
# 10 A D H
# 11 B D H
# 12 C D H
# 13 A E H
# 14 B E H
# 15 C E H
# 16 A F H
# 17 B F H
# 18 C F H
# 19 A D I
# 20 B D I
# 21 C D I
# 22 A E I
# 23 B E I
# 24 C E I
# 25 A F I
# 26 B F I
# 27 C F I
Run Code Online (Sandbox Code Playgroud)