【问题标题】:Generate all possible combinations for Columns(cross join or Cartesian product)为列生成所有可能的组合(交叉连接或笛卡尔积)
【发布时间】:2017-08-05 23:07:01
【问题描述】:

我有一个包含三列 A、B 和 C 的 Google 电子表格文档。

我需要用 A 列和 B 列中值的所有可能组合填充 C 列。请查看捕获以了解我的意思。

我发现这是在 Excel 中完成的,here,但它在谷歌电子表格中不起作用。

即使对于更多列,该公式也应该有用(例如:四个而不是两个)

我可以这样做吗?

【问题讨论】:

    标签: google-sheets cartesian-product cross-join


    【解决方案1】:

    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
    

    您可以再次使用它来添加另一个列表:

    公式在单元格C2E2中,

    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))) )
    

    【讨论】:

    • 我应该在单个单元格中插入这个公式吗? '=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))))' 这就是我所做的,但我收到一条错误消息。你为什么把公式分成两部分?
    • 对不起,我听不懂:这里是电子表格(你可以编辑),你能把你的公式粘贴到那里吗:docs.google.com/spreadsheets/d/…
    • 您必须在公式中用分号; 替换逗号。这是区域设置。我将文件设置区域更改为美国并且它有效。
    【解决方案2】:

    在大流行后的新世界中,我们可以通过以下方式解决这个问题:

    =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<>""))))
    

    【讨论】:

      猜你喜欢
      • 2015-10-16
      • 2014-12-06
      • 1970-01-01
      • 2018-11-30
      • 2015-01-15
      • 2016-10-08
      • 2021-05-06
      • 2017-04-01
      • 2023-03-23
      相关资源
      最近更新 更多