Collapse logical table into cell strings that contains the table's variable names

조회 수: 1 (최근 30일)
I have a n x m logical truth table in the format where "a b c d" are the table variable names
exampleTable =
5×4 table
a b c d
_____ _____ _____ _____
false false false false
true true true true
false false true true
true false true false
false false false true
and I would like to collapse it into a cell array of height n like below. Each row n is a cell array of strings that contains the name of the variable (column) when the entry is true
{{''}; {'a','b','c','d'}; { 'c','d'}; { 'a','c'}; {'c'}}
I imagine I can do something with cellfun, but I'm a little stuck. Thanks for your help!

채택된 답변

Walter Roberson
Walter Roberson 2022년 1월 6일
temp = [ false false false false
true true true true
false false true true
true false true false
false false false true ];
exampleTable = array2table(temp, 'VariableNames', {'a', 'b', 'c', 'd'})
exampleTable = 5×4 table
a b c d _____ _____ _____ _____ false false false false true true true true false false true true true false true false false false false true
varnames = exampleTable.Properties.VariableNames;
output = rowfun(@(r) varnames(r), exampleTable, 'SeparateInputs', false, 'OutputFormat', 'cell')
output = 5×1 cell array
{1×0 cell} {1×4 cell} {1×2 cell} {1×2 cell} {1×1 cell}
output{2}
ans = 1×4 cell array
{'a'} {'b'} {'c'} {'d'}
  댓글 수: 3
Michael Shagam
Michael Shagam 2022년 1월 6일
편집: Michael Shagam 2022년 1월 6일
@Walter Roberson followup question. In some later existing code, I use ismember() to do a generic query for a condition. I was hoping to be able to do something like shown to return a true when a row contains an 'a' and/or 'c', but I get this error
ismember(output, {'a' 'c'})
Error using cell/ismember (line 34)
Input A of class cell and input B of class cell must be cell arrays of character vectors, unless one is a character vector.
a ugly workaround is this:
cell2mat(cellfun(@(x)any(ismember(x, {'a' 'c'})), output, 'UniformOutput', false))
ans =
5×1 logical array
0
1
1
1
0
but I'd rather keep my simple ismember() query. Is there a way I can modify the class/format of output, or do I need a stronger query?
Walter Roberson
Walter Roberson 2022년 1월 6일
If you need to do those kinds of queries, you are better off sticking with the original representation.
mask = exampleTable.a | exampleTable.c
or even
mask = any(exampleTable{:,{'a', 'c'}},2);

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Logical에 대해 자세히 알아보기

태그

제품


릴리스

R2021a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by