How to detect missing values in a string cell array

13 vues (au cours des 30 derniers jours)
Leon
Leon le 8 Mar 2025
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 commentaires
Walter Roberson
Walter Roberson le 9 Mar 2025

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

Stephen23
Stephen23 le 9 Mar 2025
"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)

Connectez-vous pour commenter.

Réponse acceptée

Walter Roberson
Walter Roberson le 8 Mar 2025
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 commentaires
Image Analyst
Image Analyst le 9 Mar 2025
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?
Walter Roberson
Walter Roberson le 9 Mar 2025
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]}

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur Data Type Identification dans Help Center et File Exchange

Tags

Produits


Version

R2024b

Community Treasure Hunt

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

Start Hunting!

Translated by