Exclude rows from table if multiple conditions are met

Hi,
I have a table with many columns and rows (long list of patients that have had many questionnaires). I want to exclude patients that haven't filled in any of 5 questionnaires, but want to keep them if they have filled in all or for example only 1 of them. I tried it with an if loop, but I get the error 'Conversion to logical form from table is not possible.'
For example for the following table
A B C D E
1 NaN NaN NaN 4 NaN
2 NaN NaN NaN NaN NaN
3 8 6 9 3 5
4 4 8 NaN 5 4
5 NaN NaN NaN NaN NaN
6 NaN 3 2 NaN NaN
I want to exclude rows 2 and 5 since all questionnaires are not filled in but keep the rest, including the rows with only a few filled-in questionnaires.
I tried it with an if loop (if all 5 questionnaires are not NaN, then keep the rows, otherwise delete them), but then got the error as written above.
Anyone know how to do this? Thanks!

 Accepted Answer

m = [1 NaN NaN NaN 4 NaN
2 NaN NaN NaN NaN NaN
3 8 6 9 3 5
4 4 8 NaN 5 4
5 NaN NaN NaN NaN NaN
6 NaN 3 2 NaN NaN]
m = 6×6
1 NaN NaN NaN 4 NaN 2 NaN NaN NaN NaN NaN 3 8 6 9 3 5 4 4 8 NaN 5 4 5 NaN NaN NaN NaN NaN 6 NaN 3 2 NaN NaN
rmmissing(m,'MinNumMissing',5)
ans = 4×6
1 NaN NaN NaN 4 NaN 3 8 6 9 3 5 4 4 8 NaN 5 4 6 NaN 3 2 NaN NaN

4 Comments

Thanks! I think this may work but my table has over 1600 columns and I need to exclude rows from the original table (e.g. I first deleted rows with no age available, then rows with a wrong date, etc.) and now I need to exclude based on missing questionnaires, so I cannot create a separate table such as 'm' in your example. Is this method you explained also possible if you have columns A-Q but want to exclude based on values in columns A-E?
Yes, please see below
t = [NaN NaN NaN 4 NaN
NaN NaN NaN NaN NaN
8 6 9 3 5
4 8 NaN 5 4
NaN NaN NaN NaN NaN
NaN 3 2 NaN NaN];
t=array2table(t)
t = 6×5 table
t1 t2 t3 t4 t5 ___ ___ ___ ___ ___ NaN NaN NaN 4 NaN NaN NaN NaN NaN NaN 8 6 9 3 5 4 8 NaN 5 4 NaN NaN NaN NaN NaN NaN 3 2 NaN NaN
t.Properties.VariableNames = {'A' 'B' 'C' 'D' 'E'};
new_t = rmmissing(t,'MinNumMissing',3,'DataVariables',["A" "B" "C"])
new_t = 3×5 table
A B C D E ___ _ ___ ___ ___ 8 6 9 3 5 4 8 NaN 5 4 NaN 3 2 NaN NaN
Thank you very much!! It worked!

Sign in to comment.

More Answers (1)

A=randi(5,5); A(A<=4)=nan
A = 5×5
NaN NaN NaN NaN NaN 5 NaN NaN NaN 5 NaN NaN NaN NaN NaN NaN 5 NaN NaN 5 NaN NaN NaN 5 NaN
A(all(isnan(A),2),:)=[]
A = 3×5
5 NaN NaN NaN 5 NaN 5 NaN NaN 5 NaN NaN NaN 5 NaN

Tags

Asked:

on 21 Jul 2022

Commented:

on 22 Jul 2022

Community Treasure Hunt

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

Start Hunting!