Forum Discussion
Anonymous
2 years agoNot applicable
Conditional Column with variables
I want to compare the text strings in four columns. If the string is the same in all four columns, then the score is 6. If none of the strings match, then 0. I can create six conditional columns ...
- 2 years ago
HI Anonymous
Whichever way you approach this, I think there will be a a few steps to the calculation.
However, to write it in a general way, I would do something like this:
= Table.AddColumn( Source, "Score", each let ValuesList = {[A],[B],[C],[D]}, // Could rewrite if you need it to be dynamic ValuesColumn = Table.FromList(ValuesList, each {_}), GroupedCount = Table.Group(ValuesColumn,{"Column1"},{"Count", Table.RowCount, Int64.Type})[Count], PairsCount = List.Sum(List.Transform(GroupedCount, each Number.Combinations(_,2))) in PairsCount, Int64.Type )There could be a smarter or less verbose approach - will give it some more thought 🙂
Regards
dufoq3
Community Champion
2 years agoHi Anonymous, different approach here.
You have to define column names to calc here:
Result
let
Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMlTSQcKxOggRIzCGiRjAMUjECMpDqDHAqsYYiE2B2ARujjFUF1AkFgA=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [A = _t, B = _t, C = _t, D = _t]),
ColumnNamesToCalc = List.Buffer({"A", "B", "C", "D"}),
ColumnCombinations = List.Buffer(List.Accumulate(
List.Zip({ {0..List.Count(ColumnNamesToCalc)-1}, ColumnNamesToCalc }),
{},
(s,c)=> s & [ x = List.RemoveMatchingItems(List.Skip(ColumnNamesToCalc, c{0}+1), {c{1}}),
y = List.Repeat({c{1}}, List.Count(x)),
z = List.Zip({ y, x })
][z]
)),
ChangedType = Table.TransformColumnTypes(Source,{{"A", Int64.Type}, {"B", Int64.Type}, {"C", Int64.Type}, {"D", Int64.Type}}),
Ad_Result = Table.AddColumn(ChangedType, "Result", each
List.Sum(List.Transform(ColumnCombinations, (x)=>
[ a = Record.FieldOrDefault(_, x{0}, null),
b = Record.FieldOrDefault(_, x{1}, null),
c = if a = b then 1 else 0
][c] )), type number)
in
Ad_Result