How to filter a table in matlab and then assign a value using a loop
조회 수: 7 (최근 30일)
이전 댓글 표시
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
채택된 답변
Stephan
2019년 3월 4일
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
추가 답변 (1개)
Andrei Bobrov
2019년 3월 4일
편집: Andrei Bobrov
2019년 3월 4일
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
Andrei Bobrov
2019년 3월 5일
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:
참고 항목
카테고리
Help Center 및 File Exchange에서 Specifying Target for Graphics Output에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!