Remove rows from table with a column match and an undefined categorical

6 Ansichten (letzte 30 Tage)
I want to remove all rows from my table T that have a (or multiple) duplicate entries in T.Name and have a value that is undefined in the categorical variable T.Result.
T.Value should be preserved regardless.
%create result array with undefined categoricals
result = [string(missing);"PASS";string(missing);string(missing);"FAIL";"PASS"];
result = categorical(result);
%crreate original table
T=table(["Bill";"Steve";"Joe";"Steve";"Bob";"Steve"],[1;2;3;2;5;2],result,'VariableNames',["Name","Value","Result"]);
T.Result=char(T.Result)
T = 6×3 table
Name Value Result _______ _____ ___________ "Bill" 1 <undefined> "Steve" 2 PASS "Joe" 3 <undefined> "Steve" 2 <undefined> "Bob" 5 FAIL "Steve" 2 PASS
%The solution would eliminate row 4 beacuse "Steve" has a match and T.Result is undefined
%Rows 1 and 3 stay because T.Name does not have a match.
%Row 6 stays because T.Result is defined
solution=T([1:3 5:6],:)
solution = 5×3 table
Name Value Result _______ _____ ___________ "Bill" 1 <undefined> "Steve" 2 PASS "Joe" 3 <undefined> "Bob" 5 FAIL "Steve" 2 PASS

Akzeptierte Antwort

Voss
Voss am 24 Feb. 2024
%create result array with undefined categoricals
result = [string(missing);"PASS";string(missing);string(missing);"FAIL";"PASS"];
result = categorical(result);
%crreate original table
T=table(["Bill";"Steve";"Joe";"Steve";"Bob";"Steve"],[1;2;3;2;5;2],result,'VariableNames',["Name","Value","Result"]);
T.Result=char(T.Result)
T = 6×3 table
Name Value Result _______ _____ ___________ "Bill" 1 <undefined> "Steve" 2 PASS "Joe" 3 <undefined> "Steve" 2 <undefined> "Bob" 5 FAIL "Steve" 2 PASS
% logical index by row of whether Name appears more than once in the table:
name_repeated = sum(T.Name.' == T.Name, 2) > 1;
% logical index by row of whether Result is '<undefined>':
result_missing = strcmp(strtrim(cellstr(T.Result)),'<undefined>');
% if you were to keep T.Result as categorical, you could use this expression instead:
% result_missing = ismissing(T.Result);
% rows to remove:
remove_row = name_repeated & result_missing;
% remove the rows:
T(remove_row,:) = []
T = 5×3 table
Name Value Result _______ _____ ___________ "Bill" 1 <undefined> "Steve" 2 PASS "Joe" 3 <undefined> "Bob" 5 FAIL "Steve" 2 PASS

Weitere Antworten (0)

Kategorien

Mehr zu Categorical Arrays finden Sie in Help Center und File Exchange

Tags

Produkte


Version

R2023b

Community Treasure Hunt

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

Start Hunting!

Translated by