Novis, trying to learn IML. In the program below, I am trying to pick the LBN values which satisfies low - high range, create output dataset test1 as subset of test which satisfy this condition in most efficient way (without listing all of the variables).
Thanks.
proc iml ;
use test;
read all var _NUM_ into x[c=NumVar];
close test;
r_x=nrow(x);
c_x=ncol(x);
/* Lab date variable d */
lbn = x[, 'd'];
/*Upper Lower limits for week 100 boundaries*/
low = x[, 'const'] + 2;
high = x[, 'const'] + 15;
outc = x[,'s'];
/* outc = j(nrow(s), 1); */
idx = loc (lbn <= high & lbn >= low );
y=j(nrow());
if ncol (idx)> 0 then y[idx]=x;
print x , y;
print satisfy "Criteria Met";
print (lbn[idx])[label='lab date'] , (low[idx]) [label='lowb'],
(high[idx]) [label='highb'], [label='test'];
create TEST1 from y ;
append from y;
close test1;
quit;
You have read all the variables into X. So use the LOC function to find the rows that satisfy the condition, then use the index to subset the rows of X:
idx = loc (lbn <= high & lbn >= low );
y = x[idx,]; /* subset rows, include all columns */
create TEST1 from y[c=NumVar];
append from y;
close test1;
When you leave the column index blank (as above), it means "use all columns." For more information about subscripting matrices, see "Extracting elements from matrix."
Original test data:
data test (drop=v);
p=1; d=2; z=3; const=11; s=0;
output;
do v=1 to 15 by 1;
const=11;
p+3; d+5; z+7;
output;
end;
run;
You have read all the variables into X. So use the LOC function to find the rows that satisfy the condition, then use the index to subset the rows of X:
idx = loc (lbn <= high & lbn >= low );
y = x[idx,]; /* subset rows, include all columns */
create TEST1 from y[c=NumVar];
append from y;
close test1;
When you leave the column index blank (as above), it means "use all columns." For more information about subscripting matrices, see "Extracting elements from matrix."
Suppose I would like to set values of s to 1 where conditions are met, and leave them as 0 otherwise , and keep all the original observations from test. I tried this, but only was getting 1 value of s =0?
z = j(nrow(x), 1, 0); /* vector with all rows set to 0 */
z[idx] = 1; /* change these rows to 1 */
x[,'s'] = z; /* if you want to overwrite original data */
Don't miss out on SAS Innovate - Register now for the FREE Livestream!
Can't make it to Vegas? No problem! Watch our general sessions LIVE or on-demand starting April 17th. Hear from SAS execs, best-selling author Adam Grant, Hot Ones host Sean Evans, top tech journalist Kara Swisher, AI expert Cassie Kozyrkov, and the mind-blowing dance crew iLuminate! Plus, get access to over 20 breakout sessions.
Learn how to run multiple linear regression models with and without interactions, presented by SAS user Alex Chaplin.
Find more tutorials on the SAS Users YouTube channel.