我对 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 解决方案似乎相当复杂 - 但我可能是错的,因为我不知道如何解决它。
在 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"