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 Categorical Arrays 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!

