Sort Col 1 through 5 column wise on the basis of frequency. Higher frequency will be sorted first. In case of equal frequency, larger number will be sorted first. Frequency = Occurrence Taking first column as example 1 appears 3 times, 8 appears 2 times, 4 appears once and 5 appears once. Sorting has to be done on the basis of this frequency. Hence sorting would be 1 (freq = 3), 8 (freq=2), 5 and 4 (in case of tie, larger number comes first)
📌 Challenge Details and Links
ExcelBI Excel Challenge Number: 188
Challenge Difficulty: ⭐️
📥Download Sample File
📥Link to the solutions on LinkedIn
Solving the challenge of Sort Columns by Frequency with Power Query
Power Query solution 1 for Sort Columns by Frequency, proposed by Omid Motamedisedeh:
= Table.FromColumns(List.Transform(Table.ToColumns(Source),(x)=>List.Sort(x,(a,b)=>Value.Compare(if a=null then 10 else 1/List.Count(List.Select(x,each _=a)),if b=null then 10 else 1/List.Count(List.Select(x,each _=b))))))
Power Query solution 2 for Sort Columns by Frequency, proposed by Bo Rydobon 🇹🇭:
let
Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
Sort = Table.FromColumns(
List.Transform(
Table.ToColumns(Source),
(l) =>
List.Sort(
List.RemoveNulls(l),
{{each List.Count(List.Select(l, (l) => l = _)), 1}, {each _, - 1}}
)
),
Table.ColumnNames(Source)
)
in
Sort
Power Query solution 3 for Sort Columns by Frequency, proposed by Zoran Milokanović:
let
Source = Excel.CurrentWorkbook(){[Name = "Input"]}[Content],
Solution = Table.FromColumns(
List.Transform(
Table.ToColumns(Source),
(t) =>
List.Accumulate(
List.Distinct(List.RemoveNulls(t)),
{},
(s, c) =>
let
d = List.Difference(List.RemoveNulls(t), s)
in
s & List.Select(d, each List.Contains({List.Max(List.Modes(d))}, _))
)
),
Table.ColumnNames(Source)
)
in
Solution
Power Query solution 4 for Sort Columns by Frequency, proposed by Zoran Milokanović:
let
Source = Excel.CurrentWorkbook(){[Name = "Input"]}[Content],
Solution = Table.FromColumns(
List.Transform(
Table.ToColumns(Source),
(c) =>
List.RemoveNulls(
List.Sort(
c,
{
{
(a, b) =>
Value.Compare(
List.Count(List.Select(c, each _ = b)),
List.Count(List.Select(c, each _ = a))
)
},
{each _, 1}
}
)
)
),
Table.ColumnNames(Source)
)
in
Solution
Power Query solution 5 for Sort Columns by Frequency, proposed by Alejandro Simón 🇵🇦 🇪🇸:
let
Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
Col = Table.ToColumns(Source),
Calc = List.Transform(
Col,
each
let
a = List.RemoveNulls(_),
b = Table.FromColumns({a}),
c = Table.Group(b, {"Column1"}, {"Count", each List.Count(_)}),
d = Table.Sort(c, {{"Count", Order.Descending}, {"Column1", Order.Descending}})[Column1],
e = List.Sort(a, (x, y) => Value.Compare(List.PositionOf(d, x), List.PositionOf(d, y)))
in
e
),
Sol = Table.FromColumns(Calc, Table.ColumnNames(Source))
in
Sol
Power Query solution 6 for Sort Columns by Frequency, proposed by Luan Rodrigues:
let
Fonte = [
a = List.Transform(
List.Transform(Table.ToColumns(Tabela1), (x) => List.RemoveNulls(x)),
(x) => Table.FromColumns({x})
),
a1 = List.Transform(a, each _[Column1]),
b = List.Transform(
a,
(y) =>
Table.Sort(
Table.Group(y, {"Column1"}, {"Count", each List.Count(_)}),
{{"Count", Order.Descending}, {"Column1", Order.Descending}}
)[Column1]
),
c = Table.FromRows(List.Zip({a1, b}))
][c],
Ind = Table.AddIndexColumn(Fonte, "Índice", 1, 1, Int64.Type),
exp = Table.ExpandListColumn(Ind, "Column1"),
res = Table.FromColumns(
Table.Group(
exp,
{"Índice"},
{
{
"Contagem",
each [
a = [[Column1]],
b = _[Column2]{0},
c = Table.Sort(_, each List.PositionOf(b, [Column1]))[Column1]
][c]
}
}
)[Contagem],
Table.ColumnNames(Tabela1)
)
in
res
Power Query solution 7 for Sort Columns by Frequency, proposed by Mahmoud Bani Asadi:
let
Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
a = Table.Transpose(Source),
b = Table.Split(a, 1),
c = (x) =>
let
step1 = Table.Transpose(x),
step2 = Table.SelectRows(step1, each [Column1] <> null),
step3 = Table.Group(
step2,
"Column1",
{{"tbl", each [Column1]}, {"Custom", each Table.RowCount(_)}}
),
step4 = Table.Sort(step3, {{"Custom", 1}, {"Column1", 1}}),
step5 = Table.ExpandListColumn(step4, "tbl")[Column1]
in
step5,
d = List.Transform(b, c),
e = Table.FromColumns(d, Table.ColumnNames(Source))
in
e
Power Query solution 8 for Sort Columns by Frequency, proposed by Felipe Perez Arevalo:
let
Source = Table.ToColumns(Table1),
Custom1 = Table.FromColumns(
List.Transform(
Source,
each [
step0 = List.RemoveMatchingItems(_, {null}),
step1 = Table.FromList(step0, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
step2 = Table.Group(
step1,
{"Column1"},
{
{"Count", each Table.RowCount(_), Int64.Type},
{"Details", each _, type table [Column1 = nullable number]}
}
),
step3 = Table.Sort(step2, {{"Count", Order.Descending}, {"Column1", Order.Descending}}),
step4 = Table.RemoveColumns(step3, {"Column1", "Count"}),
step5 = Table.ExpandTableColumn(step4, "Details", {"Column1"}, {"Column1"})
][step5][Column1]
),
Table.ColumnNames(Table1)
)
in
Custom1
Solving the challenge of Sort Columns by Frequency with Excel
Excel solution 1 for Sort Columns by Frequency, proposed by Bo Rydobon 🇹🇭:
=LET(z,A2:E8,MAKEARRAY(ROWS(z),COLUMNS(z),LAMBDA(r,c,LET(b,INDEX(z,,c),IF(INDEX(b,r),MOD(LARGE(COUNTIF(b,b)*100+b,r),100),"")))))
Shorter with hard code
=MAKEARRAY(7,5,LAMBDA(r,c,LET(b,INDEX(A2:E8,,c),IF(INDEX(b,r),MOD(LARGE(COUNTIF(b,b)*10+b,r),10),""))))
Excel solution 2 for Sort Columns by Frequency, proposed by Bo Rydobon 🇹🇭:
=DROP(REDUCE(0,SEQUENCE(COLUMNS(A2:E8)),LAMBDA(a,n,LET(b,INDEX(A2:E8,,n),HSTACK(a,IF(b,SORTBY(b,-COUNTIF(b,b),,-b,),""))))),,1)
Excel solution 3 for Sort Columns by Frequency, proposed by John V.:
=DROP(REDUCE(0,ROW(1:5),LAMBDA(i,y,LET(c,INDEX(A2:E8,,y),HSTACK(i,IF(c,SORTBY(c,-COUNTIF(c,c),,-c,),""))))),,1)
Excel solution 4 for Sort Columns by Frequency, proposed by محمد حلمي:
=DROP(REDUCE(0,
SEQUENCE(
5
),
LAMBDA(a,
d,
LET(
r,
INDEX(
A2:E8,
,
d
),
HSTACK(a,
IFERROR((SORTBY(
r,
COUNTIF(
r,
r
),
-1,
r,
-1
)&"")+0,
""))))),
,
1)
Excel solution 5 for Sort Columns by Frequency, proposed by 🇰🇷 Taeyong Shin:
=LET(
Fx, LAMBDA(c, SORTBY(c, -COUNTIF(c, c), , -c, )),
v, REDUCE(Fx(A2:A8), SEQUENCE(COLUMNS(B2:E8)),
LAMBDA(a,n, HSTACK(a, Fx(INDEX(B2:E8, , n)))
)),
IF(v, v, "")
)
Excel solution 6 for Sort Columns by Frequency, proposed by Julian Poeltl:
=LET(A,A2:E8,IFNA(DROP(REDUCE("",SEQUENCE(COLUMNS(A)),LAMBDA(B,C,HSTACK(B,LET(S,CHOOSECOLS(A,C),SB,SORTBY(S,MAP(S,LAMBDA(A,ROWS(FILTER(S,S=A)))),-1,S,-1),FILTER(SB,SB>0))))),,1),""))
Excel solution 7 for Sort Columns by Frequency, proposed by Timothée BLIOT:
=DROP(IFERROR(REDUCE("",A1:E1,LAMBDA(ac,z,LET(A,INDEX(A2:E8,,CONCAT(TEXTSPLIT(z,"Col "))*1),B,SORT(TAKE(A,ROWS(A)-COUNTBLANK(A)),,-1), HSTACK(ac,SORTBY( B,MAP(B,LAMBDA(x, SUMPRODUCT(1*(B=x)))),-1))))),""),,1)
Excel solution 8 for Sort Columns by Frequency, proposed by Hussein SATOUR:
=IFERROR(TRANSPOSE(--TEXTSPLIT(CONCAT(BYCOL(A2:E8, LAMBDA(x, TEXTJOIN(",",,SORTBY(x, COUNTIF(x,x), -1))&"/"))), ",", "/",1)),"")
Excel solution 9 for Sort Columns by Frequency, proposed by Oscar Mendez Roca Farell:
=DROP( IFNA( REDUCE("", SEQUENCE(5), LAMBDA(i, x, LET(_c, ORDER(TOCOL(INDEX(A2:E8, ,x), 1)),_s, SEQUENCE(ROWS(_c)), _m, MMULT(--(_c=TOROW(_c)),_c^0), _n, MMULT((_m=TOROW(_m))*(_s>=TOROW(_s)), _c^0), HSTACK(i, ORDRBY(_c, _m&_n, -1))))), ""), ,1)
Excel solution 10 for Sort Columns by Frequency, proposed by Duy Tùng:
=LET(u,DROP(REDUCE(0,A2:E2,LAMBDA(x,y,LET(a,TAKE(E8:y,,1),HSTACK(x,SORTBY(a,-COUNTIF(a,a),,-a,))))),,1),VSTACK(A1:E1,IF(u,u,"")))
Excel solution 11 for Sort Columns by Frequency, proposed by Sunny Baggu:
=LET(
_input, A2:E8,
IFNA(
DROP(
REDUCE(
"",
SEQUENCE(COLUMNS(_input)),
LAMBDA(a, v,
HSTACK(
a,
LET(
_col, INDEX(_input, , v),
_u, UNIQUE(_col),
_cnt, MAP(_u, LAMBDA(a, SUM(N(_col = a)))),
_freq, XLOOKUP(_col, _u, _cnt),
TOCOL(SORTBY(_col, _freq, -1, _col, -1), 1)
)
)
)
),
,
1
),
""
)
)
Excel solution 12 for Sort Columns by Frequency, proposed by Md. Zohurul Islam:
=LET(z,A2:E8,sq,SEQUENCE(,COLUMNS(z)),
w,DROP(REDUCE("",sq,LAMBDA(x,y,LET(
a,INDEX(z,,y),
b,COUNTIF(a,a),
d,IF(b<>0,SORTBY(a,b,-1,a,-1),""),
e,HSTACK(x,d),e))),,1),
VSTACK(A1:E1,w))
Excel solution 13 for Sort Columns by Frequency, proposed by Tolga Demirci, PMP, PMI-ACP, MOS-Expert:
=LET(w;UNIQUE(A2:A8);r;COUNTIF(A2:A8;UNIQUE(A2:A8));i;SORT(COUNTIF(A2:A8;UNIQUE(A2:A8));;-1);c;TEXTJOIN(;;REPT(IFERROR(MAP(i;r;w;LAMBDA(a;b;c;XLOOKUP(a;b;c)));MAP(i;LAMBDA(a;XLOOKUP(a;r;w))));i));MID(c;SEQUENCE(LEN(c));1))
Excel solution 14 for Sort Columns by Frequency, proposed by Stefan Olsson:
=BYCOL(A2:E8,
LAMBDA(bc,
QUERY({bc,INDEX(COUNTIF(bc,bc))},
"select Col1 order by Col2 desc, Col1 desc")))
Excel solution 15 for Sort Columns by Frequency, proposed by Daniel Garzia:
=LET(_d,A2:E8,
fx,LAMBDA(Col,LET(c,FILTER(Col,Col<>""),u,UNIQUE(c),f,DROP(FREQUENCY(c,u),-1),x,XLOOKUP(c,u,f),SORTBY(c,x,-1,c,-1))),
IFNA(REDUCE(fx(CHOOSECOLS(_d,1)),DROP(SEQUENCE(COLUMNS(_d)),1),LAMBDA(a,b,HSTACK(a,fx(INDEX(_d,SEQUENCE(ROWS(_d)),b))))),""))
Excel solution 16 for Sort Columns by Frequency, proposed by Miguel Angel Franco García:
=LET(a;INDICE(ORDENAR(ORDENAR(APILARH(A2:A8; CONTAR.SI(A2:A8; A2:A8));1;-1);2;-1);; 1);SI(a=0;""; a))
Excel solution 17 for Sort Columns by Frequency, proposed by Lorenzo Foti:
=+LET(
rng;A2:A8;
cnts;COUNTIFS(rng;rng);
ordRng;SORTBY(rng;cnts;-1;rng;-1);
outP;FILTER(ordRng;ordRng>0);
outP
)
Excel solution 18 for Sort Columns by Frequency, proposed by Caroline Blake:
=LET(a,LAMBDA(a,SORTBY(a,COUNTIF(a,a),-1,a,-1)),
b,HSTACK(a(A2:A8),a(B2:B8),a(C2:C8),a(D2:D8),a(E2:E8)),
IF(b=0,"",b))
Excel solution 19 for Sort Columns by Frequency, proposed by Júnior Araújo:
=SORTYBY(SORT(A2:A8,,-1),COUNTIF(A2:A8,SORT(A2:A8,,-1)),-1)
&&&
