Home » Group Text by Keyword

Group Text by Keyword

Populate the Groups (from table 2) on the basis of words appearing in Text column. The answer should be sorted and group names should be unique.

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

Solving the challenge of Group Text by Keyword with Power Query

Power Query solution 1 for Group Text by Keyword, proposed by Bo Rydobon 🇹🇭:
let
  Group = Table.Buffer(
    Table.UnpivotOtherColumns(Excel.CurrentWorkbook(){[Name = "Table2"]}[Content], {}, "G", "V")
  ), 
  Ans = Table.AddColumn(
    Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
    "Ans", 
    each Text.Combine(
      List.Sort(
        List.Distinct(
          List.Combine(
            List.Transform(
              Text.Split(Text.Proper([Text]), " "), 
              (w) => Table.SelectRows(Group, each [V] = w)[G]
            )
          )
        )
      ), 
      ", "
    )
  )
in
  Ans
Power Query solution 2 for Group Text by Keyword, proposed by Zoran Milokanović:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  T2 = Excel.CurrentWorkbook(){[Name = "Table2"]}[Content], 
  Groups = Table.UnpivotOtherColumns(T2, {}, "A", "V"), 
  S = Table.TransformRows(
    Source, 
    (l) =>
      Text.Combine(
        List.Select(
          Table.ColumnNames(T2), 
          each Table.RowCount(
            Table.SelectRows(
              Groups, 
              (r) =>
                r[A]
                  = _ and List.Contains(Text.Split(l[Text], " "), r[V], Comparer.OrdinalIgnoreCase)
            )
          )
            > 0
        ), 
        ", "
      )
  )
in
  S
Power Query solution 3 for Group Text by Keyword, proposed by Alejandro Simón 🇵🇦 🇪🇸:
let
  Unpivot = Table.UnpivotOtherColumns(Table2, {}, "Group", "Value"), 
  Sol = Table.AddColumn(
    Table1, 
    "Answer", 
    each Text.Combine(
      List.Distinct(
        List.Sort(
          List.RemoveNulls(
            List.Transform(
              {0 .. List.Count(Unpivot[Value]) - 1}, 
              (x) =>
                if List.Contains(
                  Text.Split([Text], " "), 
                  Unpivot[Value]{x}, 
                  Comparer.OrdinalIgnoreCase
                )
                then
                  Unpivot[Group]{x}
                else
                  null
            )
          )
        )
      ), 
      ", "
    )
  )
in
  Sol
Power Query solution 4 for Group Text by Keyword, proposed by Luan Rodrigues:
let
  Fonte = Tabela2, 
  pv = Table.UnpivotOtherColumns(Fonte, {}, "Atributo", "Valor"), 
  tip = Table.TransformColumnTypes(pv, {{"Valor", type text}}), 
  tab = Table.FuzzyNestedJoin(
    Tabela1, 
    {"Text"}, 
    tip, 
    {"Valor"}, 
    "Personalizar", 
    JoinKind.LeftOuter, 
    [IgnoreCase = true, IgnoreSpace = true, Threshold = 0.05]
  ), 
  res = Table.AddColumn(
    tab, 
    "Resposta", 
    each [
      a = List.Transform([Personalizar][Atributo], each Text.Split(_, " "){1}), 
      b = Text.Combine(
        List.Transform(
          List.Distinct(List.Transform({a}, each List.Sort(_)){0}), 
          each Text.Combine({"Group ", _})
        ), 
        ", "
      )
    ][b]
  )[[Text], [Resposta]]
in
  res
Power Query solution 5 for Group Text by Keyword, proposed by Venkata Rajesh:
let
  Source = Data, 
  Output = Table.AddColumn(
    Source, 
    "Expected", 
    each [
      w = Text.Split(Text.Proper([Text]), " "), 
      x = Table.ToColumns(Group), 
      y = Table.ColumnNames(Group), 
      z = Text.Combine(
        List.Transform(
          {0 .. List.Count(y) - 1}, 
          each if List.Count(List.Intersect({w, x{_}})) > 0 then y{_} else null
        ), 
        ", "
      )
    ][z]
  )
in
  Output

Solving the challenge of Group Text by Keyword with Excel

Excel solution 1 for Group Text by Keyword, proposed by Bo Rydobon 🇹🇭:
=MAP(A2:A11,LAMBDA(a,ARRAYTOTEXT(UNIQUE(TOCOL(IF(XMATCH(D2:G9,TEXTSPLIT(a," ")),D1:G1),3,1)))))
Excel solution 2 for Group Text by Keyword, proposed by Rick Rothstein:
=MAP(A2:A11,LAMBDA(a,TEXTJOIN(", ",,FILTER(D1:G1,BYCOL(D2:G10,LAMBDA(c,COLUMNS(TEXTSPLIT(PROPER(a),TAKE(c,COUNTA(c))))))>1))))
Excel solution 3 for Group Text by Keyword, proposed by John V.:
=MAP(A2:A11,LAMBDA(x,ARRAYTOTEXT(UNIQUE(TOCOL(IF(SEARCH(D2:G9,x)/(D2:G9>0),D1:G1),2,1)))))
Excel solution 4 for Group Text by Keyword, proposed by محمد حلمي:
=MAP(A2:A10,LAMBDA(a,LET(e,D2:G9,ARRAYTOTEXT("Group "&SORT(UNIQUE(TOCOL(IF(TOCOL(SEARCH(TOCOL(IF(e=" ","",e)),a)),LEFT(TOCOL(COLUMN(A1:D1)&e))),2)))))))
Excel solution 5 for Group Text by Keyword, proposed by Kris Jaganah:
=MAP(A2:A11,LAMBDA(x,LET(a,D1:G9,b,SEARCH(IF(a="",1,a),x),TEXTJOIN(", ",1,SORT(UNIQUE(TOCOL(IF(b>0,TAKE(a,1)),3)))))))
Excel solution 6 for Group Text by Keyword, proposed by Julian Poeltl:
=MAP(A2:A11,LAMBDA(T,TEXTJOIN(", ",,FILTER(D1:G1,BYCOL(IFERROR(SEARCH(D2:G9,T),0),LAMBDA(A,MAX(A)))>1))))
Excel solution 7 for Group Text by Keyword, proposed by Timothée BLIOT:
=MAP(A2:A11,LAMBDA(z,LET(A,TEXTSPLIT(z," "),ARRAYTOTEXT(UNIQUE( SORT(TEXTSPLIT(TEXTJOIN(":",,MAP(A,LAMBDA(x,TEXTJOIN(":",,MAP(SEQUENCE(4),LAMBDA(y,IF(ISNUMBER(XMATCH(x,INDEX(D2:G9,,y))),"Group "&y,""))))))),,":"),,1))))))
Excel solution 8 for Group Text by Keyword, proposed by Hussein SATOUR:
=MAP(A2:A11, LAMBDA(y, LET(
a, PROPER(TEXTSPLIT(y,," ")), b, TOCOL(D2:G9,,1),
c, TOCOL(IFNA(D1:G1,ROW(D2:G9)),,1),
TEXTJOIN(", ",,SORT(UNIQUE(IF(ISNA(XMATCH(b,a)),"",c)))))))
Excel solution 9 for Group Text by Keyword, proposed by Oscar Mendez Roca Farell:
=MAP(A2:A11, LAMBDA(a, TEXTJOIN(", ", 1, BYCOL(D1:G9, LAMBDA(c, IF(COUNT(SEARCH(TOCOL(c, 3), a)), TAKE(c,1),""))))))
Excel solution 10 for Group Text by Keyword, proposed by Sunny Baggu:
=MAP(
 A2:A11,
 LAMBDA(x,
 TEXTJOIN(
 ", ",
 ,
 UNIQUE(
 SORT(
 TOCOL(
 REDUCE(
 "",
 TEXTSPLIT(x, , " "),
 LAMBDA(a, v, VSTACK(a, FILTER(D1:G1, BYCOL(D2:G9 = v, LAMBDA(a, OR(a))), "")))
 ),
 3
 )
 )
 )
 )
 )
)
Excel solution 11 for Group Text by Keyword, proposed by Pieter de B.:
=LET(header,D1:G1,data,D2:G9,d,TOCOL(data,1,1),h,TOCOL(REPT(header,1/(data<>"")),2,1),MAP(A2:A11,LAMBDA(x,TEXTJOIN(", ",1,UNIQUE(XLOOKUP(TEXTSPLIT(x," "),d,h,""),1)))))
Excel solution 12 for Group Text by Keyword, proposed by Asheesh Pahwa:
=LET(a,A2:A11,
b,TEXTJOIN("||",TRUE,a),
C,TEXTSPLIT(b," ","\",,,""),
d,MAP(c,LAMBDA(x,TEXTJOIN(", ",TRUE,FILTER(D1:G1,
BY COL(D2:G9-FILTER(x,x<>""),
LAMBDA(y,OR(y))),"")))),
e,BYROW(d,LAMBDA(z,
TEXTJOIN(", ",TRUE,UNIQUE(
TOROW(UNIQUE(z),3))))),
f,IFNA(REDUCE(,e,LAMBDA(acc,itr, VSTACK(acc, TEXTSPLIT(itr,",")))),""),
g,BYROW(f,LAMBDA(y,
TEXTJOIN(", ",TRUE,SORT(UNIQUE(FILTER(y,y<>""),TRUE),,,TRUE)))),g)
Excel solution 13 for Group Text by Keyword, proposed by Julien Lacaze:
=LET(tabl1,A2:A11, tabl2,D2:G9,head2,D1:G1,
group,MAP(
TOCOL(head2&"-"&tabl2),LAMBDA(a,TEXTBEFORE(a,"-"))
),
text,TOCOL(LOWER(tabl2)),
MAP(tabl1,LAMBDA(a,TEXTJOIN(", ",,
SORT(UNIQUE(FILTER(group,
MAP(text,LAMBDA(b,OR(TEXTSPLIT(a," ")=b))))))))))
Excel solution 14 for Group Text by Keyword, proposed by Ziad A.:
=MAP(A2:A11,LAMBDA(t,JOIN(", ",FILTER(D1:G1,REGEXMATCH(t,"(?i)"&BYCOL(D2:G9,LAMBDA(c,TEXTJOIN("|",1,c))))))))
Excel solution 15 for Group Text by Keyword, proposed by Daniel Garzia:
=MAP(A2:A11,LAMBDA(l,TEXTJOIN(", ",,SORT(UNIQUE(IF(ISNA(XMATCH(TOCOL(D2:G9,,8),TEXTSPLIT(l,," "))),"",INDEX(D1:G1,SEQUENCE(32,,,1/8))))))))
Excel solution 16 for Group Text by Keyword, proposed by Daniel Garzia:
=LET(g,D2:G9,r,ROWS(g),c,COLUMNS(g),s,SEQUENCE(r*c,,,1/r),MAP(A2:A11,LAMBDA(l,TEXTJOIN(", ",,SORT(UNIQUE(IF(ISNA(XMATCH(INDEX(g,1+MOD(SEQUENCE(r*c,,0),r),s),TEXTSPLIT(l,," "))),"",INDEX(D1:G1,s))))))))
Excel solution 17 for Group Text by Keyword, proposed by Quadri Olayinka Atharu:
=MAP(A2:A11,LAMBDA(x,LET(g,D1:G1,w,D2:G9,p,(w<>"")+ISNUMBER(SEARCH(w,x))>1,TEXTJOIN(", ",,UNIQUE(TOCOL(IF(p,g,NA()),2,1))))))
Excel solution 18 for Group Text by Keyword, proposed by Quadri Olayinka Atharu:
=LET(g,D1:G9,_w,TOCOL(g,1,1),_c,SCAN("",_w,LAMBDA(a,x,IF(ISNUMBER(SEARCH("group",x)),x,a))),
r,MAP(A2:A11,LAMBDA(_t,TEXTJOIN(", ",,UNIQUE(FILTER(_c,ISNUMBER(SEARCH(_w,_t))))))),
r)
Excel solution 19 for Group Text by Keyword, proposed by Diarmuid Early:
=MAP(A2:A11, LAMBDA(a,
 TEXTJOIN(", ",,
 UNIQUE(TOCOL(
 IF(SEARCH(" "&$E$2:$H$9&" ", " "&a&" "),$E$1:$H$1)
 ,2,1)))))

The IF / SEARCH line looks for each word from the second table in one sentence, and returns the corresponding group if there's a match (or an error if not).

TOCOL converts that to a column, drops the errors (with the second argument = 2), and returns the groups in order (scan by column with third argument = 1), UNIQUE removes duplicates, and TEXTJOIN combines them into one output.

And finally, MAP / LAMBDA applies those steps to each of the inputs.

If COUNTIF could take an array as the first argument, I could have done it a nicer way! : )
Excel solution 20 for Group Text by Keyword, proposed by Amardeep Singh:
=LET(_tbl1,A2:A11,
_tbl2,D2:G9,
fn,LAMBDA(txt,ARRAYTOTEXT(FILTER(D1:G1,BYCOL(_tbl2,LAMBDA(x,SUM(--ISNUMBER(SEARCH(TOCOL(x,1),txt)))))))),
BYROW(_tbl1,LAMBDA(rv,fn(rv))))

(or)

=BYROW(A2:A11,LAMBDA(rv,ARRAYTOTEXT(FILTER(D1:G1,BYCOL(D2:G9,LAMBDA(x,SUM(--ISNUMBER(SEARCH(TOCOL(x,1),rv)))))))))
Excel solution 21 for Group Text by Keyword, proposed by Surendra Reddy:
=MAP(A2:A11,LAMBDA(x,LET(a,D2:G9,ARRAYTOTEXT(UNIQUE(TOCOL(IF(SEARCH(IF(a<>"",a,0),x),D1:G1),2,1))))))
Excel solution 22 for Group Text by Keyword, proposed by Challa Sai Kumar Reddy:
=MAP(A2:A11,LAMBDA(t,JOIN(", ",FILTER(D1:G1,REGEXMATCH(t,"(?i)"&BYCOL(D2:G9,LAMBDA(c,TEXTJOIN("|",1,c))))))))
Excel solution 23 for Group Text by Keyword, proposed by Ashish Mathur:
=LET(rng,$D$2:$G$9,BYROW(A2:A11,LAMBDA(r,ARRAYTOTEXT(UNIQUE(SORT(TOROW(IF(rng="",NA(),IF(ISNUMBER(SEARCH(rng,r)),$D$1:$G$1,NA())),2),,,TRUE),TRUE)))))

&&&

Leave a Reply