How to detect missing values in a string cell array

I have a cell array A like the below:
Columns 1 through 4
{'NAME'} {'STNNBR'} {[<missing>]} {'SAMPNO'} .
I tried to find the location of the missing value by doing the below:
B = ismissing(A)
Why is the value of B zero for all of them? Shouldn't the answer be: 0 0 1 0?
Columns 1 through 4
0 0 0 0
What is the correct way to write this code? Thanks.

2 Comments

Ah, but the missing element is not a character vector, so this is not a cell array of character vectors

"Why is the value of B zero for all of them? Shouldn't the answer be: 0 0 1 0?"
The ISMISSING documentation states that for a cell array of character vector ISMISSING returns TRUE for empty character vectors: "Missing values are defined according to the data type of A ... {''}cell of character vectors"
Your data do NOT match this requirement.
"What is the correct way to write this code?"
Use a STRING array:
A = ["NAME", "STNNBR", missing, "SAMPNO"]
ismissing(A)

Sign in to comment.

 Accepted Answer

You are applying ismissing() to a cell array. That is the same thing as calling
[ismissing(A(1)), ismissing(A(2)), ismissing(A(3)), ismissing(A(4))]
A(1), A(2), A(3), A(4) are all cells -- and the cells are not missing.
You should probably be using a string array rather than a cell array,
A = ["NAME", "STNNBR", nan, "SAMPNO"]
A = 1x4 string array
"NAME" "STNNBR" <missing> "SAMPNO"
ismissing(A)
ans = 1x4 logical array
0 0 1 0
but if you insist on using a cell array then you should have something more like
B = {'NAME', 'STNNBR', string(nan), 'SAMPNO'};
cellfun(@(X)any(ismissing(X),'all'), B)
ans = 1x4 logical array
0 0 1 0

3 Comments

Exactly what I'm looking for. Thank you so much.
I always get confused as to when I should use ismissing or isempty. It seems no matter which one I use first, it's always the second one that I should use. Any intuitive rule of thumb as to use the right one?
isempty: There is no data here.
ismissing(): There is data here, but some of it is marked as being invalid.
if isempty([]); disp('empty'); else; disp('not empty'); end
empty
if ismissing([]); disp('missing'); else; disp('not missing'); end
not missing
C = {'ab', [1 2 missing], [], missing, ["cd", missing, "ef"]}
C = 1x5 cell array
{'ab'} {[1 2 NaN]} {0x0 double} {[<missing>]} {["cd" <missing> "ef"]}
cellfun(@isempty, C, 'uniform', 0)
ans = 1x5 cell array
{[0]} {[0]} {[1]} {[0]} {[0]}
cellfun(@ismissing, C, 'uniform', 0)
ans = 1x5 cell array
{[0 0]} {[0 0 1]} {0x0 logical} {[1]} {[0 1 0]}

Sign in to comment.

More Answers (0)

Categories

Products

Release

R2024b

Tags

Community Treasure Hunt

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

Start Hunting!