计算 Excel 中一系列文本值的组合

问题描述 投票:0回答:1

我对 PowerQuery 中的 M 不太了解,无法弄清楚如何解决以下问题。

示例是,我有一个超过 300 行的 Excel 范围,每行有 12 列,其中可能包含有关原始信息源的元数据字符串(这些是单个或两个单词字符串)。 12 列中的许多列都有空值,因为并非所有行都有 12 个元数据字符串。我提供了一个虚假的数据样本,以便清楚地表明我在说什么。

身份证 输入栏1 输入栏2 输入第3栏 输入栏4
1 A B D C
2 G E F
3 A F

注意:我故意混合了字母字符的顺序,以表明顺序并不重要(不是排列算法)。

我希望能够计算所有行中所有列字符串的组合,而不计算单个列字符串,因为它不是组合,或者重复行的可能组合中的任何列字符串。因此,尽管顺序并不重要,但必须排除重复的任何组合,以便该组合有助于计数算法。我尝试查看 stackoverflow 上的选项,但它们似乎不太有效,因为它们经常重复字符串组合。

因此,如果我们仅对行 ID=1 进行计算,那么所需的输出将是,

身份证 输出列1 输出列2 输出列3 输出列4
1 A B
2 A C
3 A D
4 B C
5 B D
6 C D
7 A B C
8 A B D
9 A C D
10 B C D
11 A B C D

我想这就是全部。如果我错过了一个独特的组合,请告诉我!在一行中按字母顺序排序的解决方案(参见上表)更适合整理结果。

下表是我不想要的示例。 A 的值与其自身组合作为行 ID1 和 ID2 中的输出。行 ID3 也是不允许的,因为它不计算组合,而是计算尚未组合的唯一值。

身份证 输出列1 输出列2 输出列3
1 A A
2 A C A
3 A

powerquery 中的解决方案会很方便,因为 excel 解决方案似乎相当复杂 - 但我可能是错的,因为我不知道如何解决它。

excel powerquery combinations m
1个回答
0
投票

在 powerquery 中执行此操作的一种方法如下,它在每行的新列中生成一个表

let  Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Added Custom" = Table.AddColumn(Source, "Custom", each 
    let L=List.RemoveNulls(List.RemoveFirstN(Record.FieldValues(_),1)),
    N = List.Count(L),
    Subsets =List.Transform({0..Number.Power(2, N)-1},(i) => List.Transform({0..N-1},(j) => if Number.Mod(Number.IntegerDivide(i, Number.Power(2, j)), 2) = 1 then L{j} else null)),
    Concatenate = List.RemoveNulls(List.Transform(Subsets, each Text.Combine(List.RemoveNulls(_), ","))),
    Remove=List.RemoveNulls(List.Transform( Concatenate, each if Text.Contains(_,",") then _ else null)),
    Convert = Table.FromList(Remove, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    GetNewColNames=List.Transform({1 .. List.Max(List.Transform(Convert[Column1], each List.Count(Text.Split(_,","))))}, each "Column_"& Text.From(_)),
    Split = Table.SplitColumn(Convert, "Column1", Splitter.SplitTextByDelimiter(",", QuoteStyle.Csv), GetNewColNames)  
    in  Split)
in #"Added Custom"

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.