为列生成所有可能的组合(交叉连接或笛卡尔积)
Generate all possible combinations for Columns(cross join or Cartesian product)
我有一个包含三列 A、B 和 C 的 Google SpreadSheets 文档。
我需要用 A 列和 B 列中值的所有可能组合填充 C 列。请看一下捕获以了解我的意思。
我发现这可以在 Excel、here 中完成,但它在 google 电子表格中不起作用。
即使对于更多列(例如:四列而不是两列),该公式也应该有用
我可以这样做吗?
更新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))) )
在 post-pandemic new world 我们可以解决这个问题:
=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<>""))))
我有一个包含三列 A、B 和 C 的 Google SpreadSheets 文档。
我需要用 A 列和 B 列中值的所有可能组合填充 C 列。请看一下捕获以了解我的意思。
我发现这可以在 Excel、here 中完成,但它在 google 电子表格中不起作用。
即使对于更多列(例如:四列而不是两列),该公式也应该有用
我可以这样做吗?
更新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))) )
在 post-pandemic new world 我们可以解决这个问题:
=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<>""))))