Home » Transpose First/Last Names

Transpose First/Last Names

Transpose the problem table into Result table

📌 Challenge Details and Links
ExcelBI Power Query Challenge Number: 131
Challenge Difficulty: ⭐️⭐️⭐️
📥Download Sample File
📥Link to the solutions on LinkedIn

Solving the challenge of Transpose First/Last Names with Power Query

Power Query solution 1 for Transpose First/Last Names, proposed by Bo Rydobon 🇹🇭:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Group = Table.Group(
    Source, 
    "Column1", 
    {
      "R", 
      each Record.Combine(
        List.Combine(
          List.Transform(
            Table.Split(Table.RemoveColumns(_, "Column1"), 2), 
            each Table.ToRecords(Table.PromoteHeaders(_))
          )
        )
      )
    }
  ), 
  Expand = Table.ExpandRecordColumn(
    Group, 
    "R", 
    List.Select(
      List.Union(List.Transform(Group[R], Record.FieldNames)), 
      each Text.StartsWith(_, "V")
    )
  ), 
  Rename = Table.RenameColumns(Expand, {{"Column1", "Group"}})
in
  Rename
Power Query solution 2 for Transpose First/Last Names, proposed by Zoran Milokanović:
let
  Source = Table.ToRows(Excel.CurrentWorkbook(){[Name = "Input"]}[Content]), 
  P = Table.Combine(
    List.Transform(
      List.Numbers(1, List.Count(Source) / 2, 2), 
      each 
        let
          r = Source{_}
        in
          Table.FromRows(
            List.Accumulate(
              List.Skip(List.Positions(r)), 
              {}, 
              (s, c) => if r{c} is number then s & {{r{0}, Source{_ - 1}{c}, r{c}}} else s
            ), 
            {"Group", "A", "V"}
          )
    )
  ), 
  S = Table.Pivot(P, List.Sort(List.Distinct(P[A])), "A", "V", List.Sum)
in
  S
Power Query solution 3 for Transpose First/Last Names, proposed by Kris Jaganah:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Replace = Table.ReplaceValue(Source, null, 0, Replacer.ReplaceValue, {}), 
  Transpose = Table.Transpose(Replace), 
  Promote = Table.PromoteHeaders(Transpose, [PromoteAllScalars = true]), 
  Unpivot = Table.Unpivot(
    Promote, 
    {"3", "3_7", "2_6", "2_5", "2_4", "2", "1_3", "1_2", "1", "1_1"}, 
    "Group", 
    "Value"
  ), 
  Idx = Table.AddIndexColumn(Unpivot, "Index", 1, 1, Int64.Type), 
  Idx1 = Table.AddIndexColumn(Idx, "Index.1", 0, 1, Int64.Type), 
  Merge = Table.NestedJoin(Idx1, {"Index"}, Idx1, {"Index.1"}, "Added Index1", JoinKind.LeftOuter), 
  Xpand = Table.ExpandTableColumn(Merge, "Added Index1", {"Value"}, {"Val"}), 
  Remove = Table.RemoveColumns(Xpand, {"Index", "Index.1"}), 
  Filter = Table.SelectRows(
    Remove, 
    each not Text.StartsWith(Text.From([Val]), "V") and Text.From([Val]) <> "0"
  ), 
  TrimGroup = Table.TransformColumns(
    Filter, 
    {"Group", each Number.FromText(Text.BeforeDelimiter(_, "_"))}
  ), 
  Sort = Table.Sort(TrimGroup, {{"Value", Order.Ascending}, {"Group", Order.Ascending}}), 
  Pivot = Table.Pivot(Sort, List.Distinct(Sort[Value]), "Value", "Val")
in
  Pivot
Power Query solution 4 for Transpose First/Last Names, proposed by Alejandro Simón 🇵🇦 🇪🇸:
let
 Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
 Group = Table.Group(Source, {"Column1"}, {{"All", each Table.Combine(List.Transform(Table.Split(_,2), 
 each Table.FromColumns(List.Transform(Table.ToRows(_), List.RemoveFirstN), {"A","B"})))}}),
 Expand = Table.SelectRows(Table.ExpandTableColumn(Group, "All", Table.ColumnNames(Group[All]{0})), each ([A] <> null)),
 Sol = Table.RenameColumns(Table.Pivot(Expand, List.Distinct(Expand[A]), "A", "B"), {"Column1", "Group"})
in
 Sol
y....
let
 Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
 Group = Table.Combine(Table.Group(Source, {"Column1"}, {{"All", (x)=> Table.AddColumn(Table.PromoteHeaders(Table.Transpose(Table.SelectRows(Table.Combine(List.Transform(Table.Split(x,2), 
 each Table.FromColumns(List.Transform(Table.ToRows(_), List.RemoveFirstN), {"A","B"}))), each [A]<>null))), "Group", each x[Column1]{0})}})[All]),
 Sol = Table.ReorderColumns(Group, {List.Last(Table.ColumnNames(Group))}&List.RemoveLastN(Table.ColumnNames(Group)))
in
 Sol
                    
                  
          
Power Query solution 5 for Transpose First/Last Names, proposed by Alejandro Simón 🇵🇦 🇪🇸:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table2"]}[Content], 
  Group = Table.Sort(
    Table.Combine(
      Table.Group(
        Source, 
        {"Column1"}, 
        {
          {
            "All", 
            each 
              let
                a = Table.Split(_, 2), 
                b = List.Transform(
                  a, 
                  each 
                    let
                      c = Table.PromoteHeaders(_), 
                      d = Table.RenameColumns(c, {Table.ColumnNames(c){0}, "Group"}), 
                      e = Table.UnpivotOtherColumns(d, {"Group"}, "A", "B")
                    in
                      e
                ), 
                f = Table.Combine(b)
              in
                f
          }
        }
      )[All]
    ), 
    "A"
  ), 
  Sol = Table.Pivot(Group, List.Distinct(Group[A]), "A", "B")
in
  Sol
Power Query solution 6 for Transpose First/Last Names, proposed by Luan Rodrigues:
let
  Fonte = Tabela1, 
  gp = Table.Group(
    Fonte, 
    {"Column1"}, 
    {
      {
        "Contagem", 
        each [
          a = List.Combine(List.Split(Table.ToRows(_), 2)), 
          b = List.Zip(
            {List.Combine(List.Alternate(a, 1, 1, 1)), List.Combine(List.Alternate(a, 1, 1))}
          ), 
          c = Table.PromoteHeaders(
            Table.Transpose(Table.SelectRows(Table.FromRows(b), each [Column1] is text))
          )
        ][c]
      }
    }
  ), 
  res = Table.ExpandTableColumn(gp, "Contagem", Table.ColumnNames(gp[Contagem]{0}))
in
  res
Power Query solution 7 for Transpose First/Last Names, proposed by Ramiro Ayala Chávez:
let
  Origen = Excel.CurrentWorkbook(){[Name = "Tabla1"]}[Content], 
  a = List.Combine(List.Transform(Table.Split(Origen, 2), each Record.FieldValues(_{0}))), 
  b = List.Combine(List.Transform(Table.Split(Origen, 2), each Record.FieldValues(_{1}))), 
  c = Table.AddColumn(
    Table.FromColumns({a, b}), 
    "Group", 
    each if [Column1] is number then [Column1] else null
  ), 
  d = Table.SelectRows(Table.FillDown(c, {"Group"}), each [Column1] is text), 
  Sol = Table.Pivot(d, List.Distinct(d[Column1]), "Column1", "Column2")
in
  Sol
Power Query solution 8 for Transpose First/Last Names, proposed by Ramiro Ayala Chávez:
let
  Origen = Excel.CurrentWorkbook(){[Name = "Tabla1"]}[Content], 
  a = Table.Transpose(Origen), 
  b = List.Combine(
    Table.ToColumns(Table.SelectColumns(a, List.Alternate(Table.ColumnNames(a), 1, 1, 1)))
  ), 
  c = List.Combine(
    Table.ToColumns(Table.SelectColumns(a, List.Alternate(Table.ColumnNames(a), 1, 1)))
  ), 
  d = Table.AddColumn(
    Table.FromColumns({b, c}), 
    "Group", 
    each if [Column1] is number then [Column1] else null
  ), 
  e = Table.SelectRows(Table.FillDown(d, {"Group"}), each [Column1] is text), 
  Sol = Table.Pivot(e, List.Distinct(e[Column1]), "Column1", "Column2")
in
  Sol
Power Query solution 9 for Transpose First/Last Names, proposed by Eric Laforce:
let
 Source = Excel.CurrentWorkbook(){[Name="tData131"]}[Content],
 Rename = Table.RenameColumns(Source, {"Column1", "Group"}),
 Group = Table.Group(Rename, {"Group"}, {"All", each let 
 _L = List.Split(List.Combine(List.Skip(Table.ToColumns(_))),2),
 _RN = List.Combine(List.Select(_L, each _{0}<>null)),
 _in Record.FromList(List.Alternate(_RN,1,1), List.Alternate(_RN,1,1,1)) }),
 FName = List.Union(List.Transform(Group[All], Record.FieldNames)), 
 Expand = Table.ExpandRecordColumn(Group, "All", List.Sort(FName))
in
 Expand
                    
                  
          
Power Query solution 10 for Transpose First/Last Names, proposed by 🇮🇷 Navid Esmaeilzadeh اسماعیل زاده:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  C = Table.ToRows(Source), 
  C2 = Table.FromColumns({List.Alternate(C, 1, 1, 1), List.Alternate(C, 1, 1)}), 
  A = Table.AddColumn(C2, "Group", each Table.FromColumns({[Column1], [Column2]})), 
  R = Table.SelectColumns(A, {"Group"}), 
  E = Table.ExpandTableColumn(R, "Group", {"Column1", "Column2"}, {"Column1", "Column2"}), 
  F = Table.SelectRows(E, each ([Column1] <> null)), 
  C3 = Table.TransformColumnTypes(F, {{"Column1", type text}}), 
  A2 = Table.AddColumn(
    C3, 
    "Group", 
    each if Text.Contains([Column1], "Value") then null else [Column1]
  ), 
  F2 = Table.FillDown(A2, {"Group"}), 
  F3 = Table.SelectRows(F2, each Text.Contains([Column1], "Value")), 
  P = Table.Pivot(F3, List.Distinct(F3[Column1]), "Column1", "Column2")
in
  P
Power Query solution 11 for Transpose First/Last Names, proposed by Luke Jarych:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  TableSplit = Table.Split(Source, 2), 
  ListTransform = List.Transform(TableSplit, each Table.PromoteHeaders(_)), 
  RenameColumns = List.Transform(
    ListTransform, 
    each Table.RenameColumns(_, {Table.ColumnNames(_){0}, "Group"})
  ), 
  UnpivotOtherColumnsThanGroup = List.Transform(
    RenameColumns, 
    each Table.UnpivotOtherColumns(_, {"Group"}, "Attribute", "Value")
  ), 
  CombineTables = Table.Combine(UnpivotOtherColumnsThanGroup), 
  SortedRows = Table.Sort(CombineTables, {{"Attribute", Order.Ascending}}), 
  PivotedColumn = Table.Pivot(
    SortedRows, 
    List.Distinct(SortedRows[Attribute]), 
    "Attribute", 
    "Value", 
    List.Sum
  )
in
  PivotedColumn
Power Query solution 12 for Transpose First/Last Names, proposed by Sandeep Marwal:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Custom1 = Table.Split(Source, 2), 
  Custom3 = List.Transform(
    Custom1, 
    each Table.UnpivotOtherColumns(
      Table.PromoteHeaders(_), 
      {Text.From(Table.FirstValue(_))}, 
      "Attribute", 
      "Value"
    )
  ), 
  Custom2 = List.Transform(Custom3, each Table.RenameColumns(_, {Table.ColumnNames(_){0}, "Group"})), 
  Custom4 = Table.Combine(Custom2), 
  #"Sorted Rows" = Table.Sort(Custom4, {{"Attribute", Order.Ascending}}), 
  #"Pivoted Column" = Table.Pivot(
    #"Sorted Rows", 
    List.Distinct(#"Sorted Rows"[Attribute]), 
    "Attribute", 
    "Value", 
    List.Sum
  )
in
  #"Pivoted Column"
Power Query solution 13 for Transpose First/Last Names, proposed by Shahariar Hafiz:
lete the empty column)

Happy Learning 🎉



                    
                  
          

Solving the challenge of Transpose First/Last Names with Excel

Excel solution 1 for Transpose First/Last Names, proposed by Bo Rydobon 🇹🇭:
=LET(a,A1:A10,d,B1:F10,w,WRAPROWS(TOCOL(IF(d>"",a&d,d),,1),2),h,UNIQUE(TOROW(IFS(d>"",d),3),1),n,UNIQUE(a),g,VLOOKUP(n&h,w,2,0),HSTACK(VSTACK("Group",n),VSTACK(h,IFNA(IF(g,g,""),""))))
Excel solution 2 for Transpose First/Last Names, proposed by محمد حلمي:
=LET(i,A1:A10,b,B1:F10,s,FIND("V",b),x,REDUCE(HSTACK("Group",UNIQUE(TOROW(IF(s,b),2),1)),UNIQUE(i),LAMBDA(a,v,IFNA(VSTACK(a,HSTACK(v,TOROW(IFS(i=v,s*B2:F11),2))),""))),IF(x=0,"",x))
Excel solution 3 for Transpose First/Last Names, proposed by محمد حلمي:
=DROP(REDUCE(0,UNIQUE(A1:A10),LAMBDA(a,d,LET(x,SORT(WRAPCOLS(TOCOL(FILTER(B1:F10,A1:A10=d),,1),2),,,1),c,HSTACK(d,DROP(FILTER(x,TAKE(x,1)>0),1)),IFNA(VSTACK(a,IF(c,c,"")),"")))),1)
Excel solution 4 for Transpose First/Last Names, proposed by محمد حلمي:
=LET(u,A1:A10,b,B1:F10,i,TOCOL(b),REDUCE(HSTACK("Group",TOROW(UNIQUE(FILTER(i,i>"")))),UNIQUE(u),LAMBDA(a,d,LET(x,SORT(WRAPCOLS(TOCOL(FILTER(b,u=d),,1),2),,,1),c,DROP(FILTER(x,TAKE(x,1)>0),1),IFNA(VSTACK(a,HSTACK(d,IF(c,c,""))),"")))))
Excel solution 5 for Transpose First/Last Names, proposed by 🇰🇷 Taeyong Shin:
=LET(d,B1:F10,F,LAMBDA(x,TOCOL(IFS(d>"",x),2)),pv,PIVOTBY(F(A1:A10),F(d),F(DROP(d,1)),SUM,,0,,0),IF(pv>0,pv,""))
Excel solution 6 for Transpose First/Last Names, proposed by Kris Jaganah:
=LET(a,A1:A10,b,B1:F10,c,TOCOL(a&"-"&b,,1),d,VSTACK(DROP(c,1),0),e,UNIQUE(a),f,TOROW(b),g,UNIQUE(FILTER(f,LEFT(f)="V"),1),HSTACK(VSTACK("Group",e),VSTACK(g,IFERROR(XLOOKUP(e&"-"&g,c,--TEXTAFTER(d,"-")),""))))
Excel solution 7 for Transpose First/Last Names, proposed by Duy Tùng:
=LET(a,B2:F10,f,LAMBDA(x,TOCOL(IFS(a,x),3)),b,PIVOTBY(f(A2:A10),f(B1:F9),f(a),SUM,,0,,0),IF(TAKE(b,1)&TAKE(b,,1)="","Group",b))
Excel solution 8 for Transpose First/Last Names, proposed by Sunny Baggu:
=LET(
 _s, SEARCH("val", B1:F10),
 VSTACK(
 HSTACK("Group", UNIQUE(TOROW(IF(_s, B1:F10), 3), 1)),
 IFNA(
 DROP(
 REDUCE(
 "🌻Thank you Vijay sir🌼",
 UNIQUE(A1:A10),
 LAMBDA(a, v, VSTACK(a, HSTACK(v, TOROW(FILTER(IF(_s, B2:F11), A1:A10 = v), 3))))
 ),
 1
 ),
 ""
 )
 )
)
Excel solution 9 for Transpose First/Last Names, proposed by LEONARD OCHEA 🇷🇴:
=LET(t,A1:F10,n,INDEX(t,,1),d,DROP(t,,1),F,LAMBDA(x,y,CHOOSEROWS(x,SEQUENCE(ROWS(t)/2,,y,2))),c,TOCOL(IF(F(d,1)<>"",F(n,1))), PIVOTBY(c,TOCOL(F(d,1)),TOCOL(F(d,2)),SUM,0,0,,0,,c))

Solving the challenge of Transpose First/Last Names with R

R solution 1 for Transpose First/Last Names, proposed by Konrad Gryczan, PhD:
library(tidyverse)
library(readxl)
input = read_excel("PQ_Challenge_131.xlsx", range = "A1:F10", col_names = FALSE)
test = read_excel("PQ_Challenge_131.xlsx", range = "I1:R4", col_names = TRUE)
labels = input %>% 
 filter(row_number() %% 2 == 1) %>%
 pivot_longer(cols = -c(...1), names_to = "row", values_to = "label")
values = input %>% 
 filter(row_number() %% 2 == 0) %>%
 pivot_longer(cols = -c(...1), nam&es_to = "row", values_to = "value")
final = bind_cols(labels, values) %>% 
 select(Group = ...1, label , value ) %>%
 filter(!is.na(label)) %>%
 pivot_wider(names_from = label, values_from = value) %>%
 mutate(across(everything(), ~ifelse(is.na(.), NA_integer_, as.numeric(.))))
                    
                  

&&

Leave a Reply