I want to replace missing value in a matrix A with zero and first need to find their locations in the matrix. Since function loc() treats the missing values as zero, how can I use the function to find their locations in A?
proc iml;
A = {. 2 3, 4 . 6};
idx = loc(A=.);
A[idx] = 0;
Because missing values are treated as zero, Your code seems not work properly. The problem is the same as that I met.
Works fine for me, idx identifies the missing as 1, 5. Next line replaces them to be 0's.
proc iml;
A = {. 2 3, 4 . 6};
idx = loc(A=.);
print idx;
A[idx] = 0;
print a;
OUTPUT:
The SAS System
1 | 5 |
0 | 2 | 3 |
4 | 0 | 6 |
I get it. Thanks a lot!
Steve
As far as I know, missing values are not "treated as zero" anywhere in IML. You might be thinking of the behavior of an IF/THEN-ELSE statement, where a missing value in the IF conditional results in the condition evaluating to FALSE.
I was misleaded by the statements for Loc function in Usg/IML12.1 that read:
The loc funciton finds nonzero elements of a matix. .... . Missing values treated as zeros.:smileyconfused:
I see. I interpret that phrase to mean that
y = loc(x);
will produce a matrix y such that y[i,j]=0 whenever x[i,j] is zero or missing, but I see how that phrase might be confusing. To make sure you always get the correct answer, I recommend using a logical expression as the argument to the LOC function. For example
y = loc(x^=0);
or
y = loc(x>0);
etc
Catch the best of SAS Innovate 2025 — anytime, anywhere. Stream powerful keynotes, real-world demos, and game-changing insights from the world’s leading data and AI minds.