How to filter a table in matlab and then assign a value using a loop
7 views (last 30 days)
Show older comments
Hi. I have a table A with 5 columns, the first three columns are categorical and the other two are numbers. The table contains 198 riws and is like this:
TumoSize NodalStatus Grading ER HER2
pT1b pN0 G2 0 0
pT2 pN3 G3 90 3
pT2 p1mi G2 55 2
...
Now, I have to filter this table per raw and assign a score of:
- 2 when TumorSize is equal to pT2 or pT3 or pT4
- 1 when NodalStatus is equal to pN2 or N3
- 1 when Grading is equal to G3
- 1 when ER is <70
- 1 when HER2 is equal to 0 or 1 or 2
At the end, I have to sum all this score per raw and then divide in three groups, according to the score (score between 0-2; score 3 or 4 and score 5-7)
My code, that doesn't work, is:
for r = 1:size(A,1)
for c = 1:size(A,2)
g = A(r,c);
score = 0;
if g == 'pT2' || g == 'pT3' || g == 'pT4' || g == 'pN2' || g == 'pN3'
score = 2;
else if g == 'G3' || g >= 0 && g<70 || g == 0 || g == 1 || g == 2
score = 1;
else
score = 0
end
B(r,c) = score
end
end
end
total_score = sum(B,2) %sum score
firstgroup = sum(total_score == 0 | total_score == 1 | total_score == 2)
secondgroup = sum(total_score == 3 | total_score == 4)
thirdgroup = sum(total_score == 5 | total_score == 6 | total_score == 7)
it doesn't work!!! Help me please :)
thank you in advance
3 Comments
Accepted Answer
Stephan
on 4 Mar 2019
Hi,
try:
% Define a column for Scores
A.Score(1:size(A,1),1) = 0;
% Scores due to Tumor Size
A.Score(A.TumorSize=='pT2' | A.TumorSize=='pT3' | A.TumorSize=='pT4') = A.Score(A.TumorSize=='pT2' | A.TumorSize=='pT3' | A.TumorSize=='pT4') + 2;
% Scores due to Nodal Status
A.Score(A.NodalStatus=='pN2' | A.TumorSize=='pN3') = A.Score(A.NodalStatus=='pN2' | A.TumorSize=='pN3') + 1;
% Scores due to Grading
A.Score(A.Grading=='G3') = A.Score(A.Grading=='G3') + 1;
% Scores due to ER
A.Score(A.ER<70) = A.Score(A.ER<70) + 1;
% Scores due to HER2
A.Score(A.HER2==0 | A.HER2==1 | A.HER2==2) = A.Score(A.HER2==0 | A.HER2==1 | A.HER2==2) + 1;
%Define column for Grouping
A.Group(1:size(A,1),1) = NaN;
% Assign groups due to Scores
A.Group(A.Score>=0 & A.Score<=2) = 1;
A.Group(A.Score>=3 & A.Score<=4) = 2;
A.Group(A.Score>=5 & A.Score<=7) = 3;
Best regards
Stephan
More Answers (1)
Andrei Bobrov
on 4 Mar 2019
Edited: Andrei Bobrov
on 4 Mar 2019
Let T - your table
x = sum([ismember(T{:,1:3},categorical({'pT2','pT3','pT4','pN2','N3','G3'})),...
[T.ER < 70 ,ismember(T.HER2,0:2)]],2);
T.group = discretize(x,[0 3 5 7],'categorical',...
{'firstgroup','secondgroup','thirdgroup'});
5 Comments
Andrei Bobrov
on 5 Mar 2019
Hi!
I'm use your mat-file and my code working.
>> load('J:\Octavework\answers\mat-files\A.mat')
>> T = A;
x = [ismember(T{:,1:3},categorical({'pT2','pT3','pT4','pN2','N3','G3'})),...
[T.ER < 70 ,ismember(T.HER2,0:2)]]*[2;ones(size(A,2)-1,1)];
T.group = discretize(x,[0 3 5 7],'categorical',...
{'firstgroup','secondgroup','thirdgroup'})
T =
198×6 table
TumorSize NodalStatus Grading ER HER2 group
__________ ___________ _______ __ ____ ___________
pT1b pN0 G2 0 0 firstgroup
pT2 pN0 G3 90 3 secondgroup
pT2 PN0 G2 0 0 secondgroup
pT1c pN1mi G2 90 0 firstgroup
pT1b pN0 G3 90 2 firstgroup
pT1c pN0 G3 90 1 firstgroup
pT1b pN0 G2 90 0 firstgroup
pT1a pN0 G3 0 3 firstgroup
pT1c pN0 G3 0 0 secondgroup
pT1a pN0 G3 95 0 firstgroup
in live editor:
See Also
Categories
Find more on Specifying Target for Graphics Output in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!