【发布时间】:2017-08-05 23:07:01
【问题描述】:
我有一个包含三列 A、B 和 C 的 Google 电子表格文档。
我需要用 A 列和 B 列中值的所有可能组合填充 C 列。请查看捕获以了解我的意思。
我发现这是在 Excel 中完成的,here,但它在谷歌电子表格中不起作用。
即使对于更多列,该公式也应该有用(例如:四个而不是两个)
我可以这样做吗?
【问题讨论】:
标签: google-sheets cartesian-product cross-join
我有一个包含三列 A、B 和 C 的 Google 电子表格文档。
我需要用 A 列和 B 列中值的所有可能组合填充 C 列。请查看捕获以了解我的意思。
我发现这是在 Excel 中完成的,here,但它在谷歌电子表格中不起作用。
即使对于更多列,该公式也应该有用(例如:四个而不是两个)
我可以这样做吗?
【问题讨论】:
标签: google-sheets cartesian-product cross-join
201810 更新
大型数据集的原始公式崩溃。我描述了一种与任意大小的数据进行交叉连接的方法here。
试试公式:
=ArrayFormula(transpose(split(rept(concatenate(A2:A&char(9)),counta(B2:B)),char(9)))
&" "&transpose(split(concatenate(rept(B2:B&char(9),counta(A2:A))),char(9))))
结果:
car red
train red
car yellow
train yellow
car blue
train blue
您可以再次使用它来添加另一个列表:
公式在单元格C2和E2中,
C2 是:
=ArrayFormula(transpose(split(rept(concatenate(A2:A&char(9)),counta(B2:B)),char(9)))&" "&transpose(split(concatenate(rept(B2:B&char(9),counta(A2:A))),char(9))) )
而E2 是:
=ArrayFormula(transpose(split(rept(concatenate(C2:C&char(9)),counta(D2:D)),char(9)))&" "&transpose(split(concatenate(rept(D2:D&char(9),counta(C2:C))),char(9))) )
【讨论】:
; 替换逗号。这是区域设置。我将文件设置区域更改为美国并且它有效。
在大流行后的新世界中,我们可以通过以下方式解决这个问题:
=INDEX(FLATTEN(A2:A3&" "&TRANSPOSE(B2:B4)))
考虑到未来的扩展,我们可以这样做:
=INDEX(FLATTEN(FILTER(A2:A; A2:A<>"")&" "&TRANSPOSE(FILTER(B2:B; B2:B<>""))))
3 列:
=INDEX(FLATTEN(FLATTEN(
FILTER(A2:A; A2:A<>"")&" "&TRANSPOSE(
FILTER(B2:B; B2:B<>"")))&" "&TRANSPOSE(
FILTER(C2:C; C2:C<>""))))
4 列:
=INDEX(FLATTEN(FLATTEN(FLATTEN(
FILTER(A2:A; A2:A<>"")&" "&TRANSPOSE(
FILTER(B2:B; B2:B<>"")))&" "&TRANSPOSE(
FILTER(C2:C; C2:C<>"")))&" "&TRANSPOSE(
FILTER(D2:D; D2:D<>""))))
【讨论】: