Transpose the problem table into result table.
📌 Challenge Details and Links
ExcelBI Power Query Challenge Number: 138
Challenge Difficulty: ⭐️⭐️
📥Download Sample File
📥Link to the solutions on LinkedIn
Solving the challenge of Transpose People Table with Power Query
Power Query solution 1 for Transpose People Table, proposed by Zoran Milokanović:
let
Source = Table.ToRows(Excel.CurrentWorkbook(){[Name = "Input"]}[Content]),
T = (_, i) =>
let
l = List.RemoveNulls(List.Combine(List.Alternate(_, 1, 1, i)))
in
List.Split(l & List.Repeat({null}, Number.Mod(List.Count(l), 2)), 2),
S = Table.FromRows(
List.TransformMany(List.Zip({T(Source, 1), T(Source, 0)}), (i) => {i{0} & i{1}}, (i, o) => o),
{"Group1", "Group2", "Value1", "Value2"}
)
in
S
Power Query solution 2 for Transpose People Table, proposed by Kris Jaganah:
let
Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
Combine = List.RemoveNulls(List.Combine(Table.ToRows(Source))),
ToTable = Table.FromList(Combine, Splitter.SplitByNothing()),
Title = Table.AddColumn(
ToTable,
"Custom",
each if Value.Is(Value.FromText([Column1]), type number) then "Value" else "Group"
),
Group = Table.Group(Title, {"Custom"}, {"All", each _, type table [Column1 = any, Custom = text]}),
Idx = Table.AddColumn(Group, "Idx", each Table.AddIndexColumn([All], "Index", 1, 1)),
Xpand = Table.ExpandTableColumn(Idx, "Idx", {"Column1", "Index"}, {"Des", "Index"}),
TitleFinal = Table.AddColumn(
Xpand,
"Title",
each if Number.IsOdd([Index]) then [Custom] & "1" else [Custom] & "2"
),
IdxRound = Table.TransformColumns(TitleFinal, {"Index", each Number.RoundUp(_ / 2)}),
Remove = Table.RemoveColumns(IdxRound, {"Custom", "All"}),
Pivot = Table.Pivot(Remove, List.Distinct(Remove[Title]), "Title", "Des"),
Remove1 = Table.RemoveColumns(Pivot, {"Index"})
in
Remove1
Power Query solution 3 for Transpose People Table, proposed by Alejandro Simón 🇵🇦 🇪🇸:
let
Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
Zip = List.Zip(List.Split(Table.ToRows(Source), 2)),
Fx = (k) =>
List.Transform(
List.Split(List.RemoveNulls(List.Combine(Zip{k})), 2),
each if List.Count(_) = 1 then _ & {null} else _
),
Sol = Table.Combine(
List.Transform(
{0 .. List.Count(Fx(0)) - 1},
each Table.FromRows({Fx(0){_} & Fx(1){_}}, {"Group1", "Group2", "Value1", "Value2"})
)
)
in
Sol
Power Query solution 4 for Transpose People Table, proposed by Alejandro Simón 🇵🇦 🇪🇸:
let
Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
Zip = List.Zip(List.Split(Table.ToRows(Source), 2)),
Zip2 = List.Transform(
List.Split(List.RemoveNulls(List.Combine(Zip{0})), 2),
each if List.Count(_) = 1 then _ & {null} else _
),
Zip3 = List.Transform(
List.Split(List.RemoveNulls(List.Combine(Zip{1})), 2),
each if List.Count(_) = 1 then _ & {null} else _
),
Sol = Table.Combine(
List.Transform(
{0 .. List.Count(Zip2) - 1},
each Table.FromRows({Zip2{_} & Zip3{_}}, {"Group1", "Group2", "Value1", "Value2"})
)
)
in
Sol
Power Query solution 5 for Transpose People Table, proposed by Luan Rodrigues:
let
Fonte = Tabela1,
res = [
a = List.Combine(Table.ToRows(Fonte)),
b = List.Transform(
List.Split(List.Select(a, each _ is text), 2),
each if List.Count(_) < 2 then _ & {null} else _
),
c = List.Transform(
List.Split(List.Select(a, each _ is number), 2),
each if List.Count(_) < 2 then _ & {null} else _
),
d = Table.FromRows(
List.Transform(List.Zip({b, c}), List.Combine),
{"Group1", "Group2", "Value1", "Value2"}
)
][d]
in
res
Power Query solution 6 for Transpose People Table, proposed by Alexis Olson:
let
Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
TransposeAndSplit = List.Split(Table.ToColumns(Table.Transpose(Source)), 2),
CombineIntoTable = Table.Combine(
List.Transform(TransposeAndSplit, each Table.FromColumns(_, {"Group", "Value"}))
),
FilterNulls = Table.SelectRows(CombineIntoTable, each [Group] <> null),
Rows = Number.RoundUp(Table.RowCount(FilterNulls) / 2),
Answer = Table.FromColumns(
List.Split(FilterNulls[Group], Rows) & List.Split(FilterNulls[Value], Rows),
{"Group1", "Group2", "Value1", "Value2"}
)
in
Answer
Power Query solution 7 for Transpose People Table, proposed by Ramiro Ayala Chávez:
let
Origen = Excel.CurrentWorkbook(){[Name = "Tabla1"]}[Content],
a = Table.ToRows(Origen),
b = List.RemoveNulls(List.Combine(List.Alternate(a, 1, 1, 1))),
c = List.RemoveNulls(List.Combine(List.Alternate(a, 1, 1))),
d = List.Alternate(b, 1, 1, 1),
e = List.Alternate(b, 1, 1),
f = List.Alternate(c, 1, 1, 1),
g = List.Alternate(c, 1, 1),
Sol = Table.FromColumns({d, e, f, g}, {"Group1", "Group2", "Value1", "Value2"})
in
Sol
Power Query solution 8 for Transpose People Table, proposed by Eric Laforce:
let
NGrp = 2,
CN = List.Combine(
List.Accumulate(
{1 .. NGrp},
{{}, {}},
(s, c) => {s{0} & {"Group" & Text.From(c)}, s{1} & {"Value" & Text.From(c)}}
)
),
Source = Excel.CurrentWorkbook(){[Name = "tData138"]}[Content],
ToRows = List.Transform(Table.ToRows(Source), List.RemoveNulls),
All = List.Zip(
{List.Combine(List.Alternate(ToRows, 1, 1, 1)), List.Combine(List.Alternate(ToRows, 1, 1, 0))}
),
Transform = List.Transform(
List.Split(All, NGrp),
(_GVs as list) =>
List.Combine(
List.Accumulate(
{0 .. NGrp - 1},
{{}, {}},
(s, c) => {s{0} & {try _GVs{c}{0} otherwise null}, s{1} & {try _GVs{c}{1} otherwise null}}
)
)
),
ToTable = Table.FromRows(Transform, CN)
in
ToTable
Power Query solution 9 for Transpose People Table, proposed by 🇮🇷 Navid Esmaeilzadeh اسماعیل زاده:
let
S = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
List = List.Select(List.Combine(Table.ToColumns(S)), each _ <> null),
F = Table.Sort(
Table.FromColumns(
{List.Alternate(List, 1, 1, 1), List.Alternate(List, 1, 1)},
{"Group", "Value"}
),
{{"Group", Order.Ascending}}
),
A = Table.AddColumn(F, "L", each Record.ToList(_)),
R = Table.SelectColumns(A, {"L"}),
E = Table.ExpandListColumn(R, "L"),
C = List.Split(E[L], 4),
D = Table.FromList(C, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
E2 = Table.TransformColumns(
D,
{"Column1", each Text.Combine(List.Transform(_, Text.From), ","), type text}
),
S2 = Table.SplitColumn(
E2,
"Column1",
Splitter.SplitTextByDelimiter(",", QuoteStyle.Csv),
{"Group1", "Value1", "Group2", "Value2"}
),
Fi = Table.ReorderColumns(S2, {"Group1", "Group2", "Value1", "Value2"})
in
Fi
Power Query solution 10 for Transpose People Table, proposed by Rafael González B.:
let
Source = Excel.CurrentWorkbook(){0}[Content],
TS = Table.Split(Source, 2),
TT = List.Transform(TS, each Table.Transpose(_)),
TC = Table.Combine(TT),
RB = Table.SelectRows(TC, each ([Column1] <> "")),
TS2 = Table.Split(RB, 1),
LT = List.Transform(
TS2,
each
let
a = Table.Pivot(_, List.Distinct(_[Column1]), "Column1", "Column2"),
b = Table.DemoteHeaders(a),
c = Table.Transpose(b)
in
c
),
TTL = Table.FromList(LT, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
Index = Table.AddIndexColumn(TTL, "Index", 1, 1, Int64.Type),
TAC = Table.AddColumn(
Index,
"Tbl",
each
let
d = Number.IsOdd([Index]),
e = Table.RenameColumns,
f = e([Column1], {{"Column1", "Group1"}, {"Column2", "Value1"}}),
g = e([Column1], {{"Column1", "Group2"}, {"Column2", "Value2"}}),
h = if d then f else g
in
h
)[Tbl],
FillUp = Table.FillUp(Table.Combine(TAC), {"Group2", "Value2"}),
Anw = Table.SelectRows(FillUp, each ([Value1] <> null))[[Group1], [Group2], [Value1], [Value2]]
in
Anw
Power Query solution 11 for Transpose People Table, proposed by Sandeep Marwal:
let
Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
Custom1 = Table.ToRows(Source),
Custom2 = List.Split(Custom1, 2),
Custom3 = List.Zip(Custom2),
Custom4 = List.Transform(Custom3, each List.RemoveNulls(List.Combine(_))),
Custom5 = Table.ToColumns(Table.AlternateRows(Table.FromColumns(Custom4), 1, 1, 1))
& Table.ToColumns(Table.AlternateRows(Table.FromColumns(Custom4), 0, 1, 1)),
Custom6 = Table.FromColumns(Custom5, {"Group1", "Value1", "Group2", "Value2"}),
#"Reordered Columns" = Table.ReorderColumns(Custom6, {"Group1", "Group2", "Value1", "Value2"})
in
#"Reordered Columns"
Power Query solution 12 for Transpose People Table, proposed by Dominic Walsh:
let
Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
Unpivot = Table.UnpivotOtherColumns(Source, {}, "Column", "Value"),
Type = Table.TransformColumnTypes(Unpivot, {{"Value", type text}}),
Group1 = List.Alternate(
List.Buffer(Table.SelectRows(Type, each ([Value] >= "A"))[Value]),
1,
1,
1
),
Group2 = List.Alternate(
List.Buffer(Table.SelectRows(Type, each ([Value] >= "A"))[Value]),
1,
1,
0
),
Value1 = List.Alternate(List.Buffer(Table.SelectRows(Type, each ([Value] < "A"))[Value]), 1, 1, 1),
Value2 = List.Alternate(List.Buffer(Table.SelectRows(Type, each ([Value] < "A"))[Value]), 1, 1, 0),
Result = Table.FromColumns(
{Group1, Group2, Value1, Value2},
{"Group1", "Group2", "Value1", "Value2"}
)
in
Result
Solving the challenge of Transpose People Table with Excel
Excel solution 1 for Transpose People Table, proposed by Rick Rothstein:
=LET(d,TOCOL(A2:F9,1),HSTACK(WRAPROWS(FILTER(d,ISTEXT(d)),2,""),WRAPROWS(FILTER(d,ISNUMBER(d)),2,"")))
Excel solution 2 for Transpose People Table, proposed by محمد حلمي:
=REDUCE(H1:K1,A2:F9,LAMBDA(a,d,
IF(ISEVEN(ROW(d))*ISODD(COLUMN(d))*(d>0),
VSTACK(a,TOROW(OFFSET(d,,,2,2))),a)))
Excel solution 3 for Transpose People Table, proposed by محمد حلمي:
=LET(m,TOCOL(A2:F9,1),HSTACK(WRAPROWS(FILTER(m,m>""),2,""),WRAPROWS(TOCOL(--m,2),2,"")))
Excel solution 4 for Transpose People Table, proposed by 🇰🇷 Taeyong Shin:
=LET(
d, A2:F9,
func, LAMBDA(fn, WRAPROWS(TOCOL(IFS(fn(d), d), 2), 2, "")),
VSTACK(TOROW({"Group";"Value"} & {1,2}), HSTACK(func(ISTEXT), func(ISNUMBER)))
)
Excel solution 5 for Transpose People Table, proposed by Kris Jaganah:
=LET(a,A2:F9,b,WRAPROWS(TOCOL(IF(ISTEXT(a),a,1/0),3),2,""),c,WRAPROWS(TOCOL(IF(a="",1/0,a/1),3),2,""),d,SEQUENCE(,COLUMNS(b)),HSTACK(VSTACK("Group"&d,b),VSTACK("Value"&d,c)))
Excel solution 6 for Transpose People Table, proposed by Nikola Z Grujicic - Nikola Ž Grujičić:
=LET(m, SEQUENCE(ROWS(A2:F9)),n, FILTER(m, MOD(m,2)=0),l, FILTER(m, MOD(m,2)=1),o, CHOOSEROWS(A2:F9,n),a, CHOOSEROWS(A2:F9,l),u, TOCOL(o),v, FILTER(u, u<>0),w, TOCOL(a),x, FILTER(w, w<>0),HSTACK(WRAPROWS(x,2,""),WRAPROWS(v,2,"")))
Excel solution 7 for Transpose People Table, proposed by Oscar Mendez Roca Farell:
=LET(_t, TOCOL(A2:F9),_f, LAMBDA(i, WRAPROWS(TOCOL(IFS(i, _t), 3), 2, "")), HSTACK(_f(_t>""),_f(_t)))
Excel solution 8 for Transpose People Table, proposed by Duy Tùng:
=LET(a,A2:F9,W,WRAPROWS,IFNA(HSTACK(W(TOCOL(IFS(a>"",a),3),2),W(TOCOL(IFS(a<"",a),3),2)),""))
Excel solution 9 for Transpose People Table, proposed by Sunny Baggu:
=LET(
_c, CODE(A2:F9) > 64,
HSTACK(
WRAPROWS(TOCOL(IF(_c, A2:F9, 1 / x), 3), 2, ""),
WRAPROWS(TOCOL(IF(1 - _c, A2:F9, 1 / x), 3), 2, "")
)
)
Excel solution 10 for Transpose People Table, proposed by Sunny Baggu:
=LET(
_c, TOCOL(A2:F9, 3),
HSTACK(
WRAPROWS(FILTER(_c, ISERR(--_c)), 2, ""),
WRAPROWS(FILTER(_c, ISNUMBER(--_c)), 2, "")
)
)
Excel solution 11 for Transpose People Table, proposed by LEONARD OCHEA 🇷🇴:
=LET(s,SEQUENCE(4,,1,2),F,LAMBDA(x,y,WRAPROWS(TOCOL(CHOOSEROWS(x,y),3),2,"")),HSTACK(F(A2:F9,s),F(A2:F9,s+1)))
Excel solution 12 for Transpose People Table, proposed by Tolga Demirci, PMP, PMI-ACP, MOS-Expert:
=LET(k;LET(i;TOCOL(A2:F9;1);FILTER(i;ISNUMBER(i)));h;LET(i;TOCOL(A2:F9;1);FILTER(i;ISTEXT(i)));HSTACK(FILTER(h;ISODD(SEQUENCE(COUNTA(h))));FILTER(h;ISEVEN(SEQUENCE(COUNTA(h))));FILTER(k;ISODD(SEQUENCE(COUNTA(k))));FILTER(k;ISEVEN(SEQUENCE(COUNTA(k))))))
Solving the challenge of Transpose People Table with R
R solution 1 for Transpose People Table, proposed by Konrad Gryczan, PhD:
library(tidyverse)
library(readxl)
input = read_excel("PQ_Challenge_138.xlsx", range = "A1:F9")
test = read_excel("PQ_Challenge_138.xlsx", range = "H1:K10")
result <- input %>%
group_by(group_id = (row_number() - 1) %/% 2) %>%
group_map(~ .x) %>%
set_names(seq_along(.))
a1 = result %>%
map(., ~ as_tibble(t(.))) %>%
bind_rows() %>%
drop_na() %>%
add_row(V1 = NA_character_, V2 = NA_character_)
a2_L = matrix(a1$V1, ncol=2, byrow = TRUE)
a2_D = matrix&(a1$V2, ncol=2, byrow = TRUE)
a2 = bind_cols(a2_L, a2_D) %>%
as_tibble() %>%
rename(Group1 = ...1, Group2 = ...2, Value1 = ...3, Value2 = ...4) %>%
mutate(Value1 = as.numeric(Value1),
Value2 = as.numeric(Value2))
&&
