我正在尝试创建一个字符串数组,并希望在其中插入一个值(如果该数组中尚不存在该值)。
我在某处读到可以在数组中使用“ IN”运算符。因此,将其编码如下:
DATA WANT;
SET HAVE;
BY ID;
ARRAY R_PROS_SCRN_ID {2} $4. R_PROS_SCRN_ID_1 - R_PROS_SCRN_ID_2;
RETAIN R_PROS_SCRN_ID_1 - R_PROS_SCRN_ID_2;
IF NOT PROS_SCRN_ID IN R_PROS_SCRN_ID THEN DO;
DO I=1 to 2 ;
IF MISSING( R_PROS_SCRN_ID{i}) THEN DO;
R_PROS_SCRN_ID{i} = PROS_SCRN_ID;
LEAVE;
END;
END;
END;
IF LAST.ID THEN OUTPUT;
RUN;
在数组R_PROS_SCRN_ID中,我只希望字段PROS_SCRN_ID中的唯一值。
它抛出错误:
NOTE: Invalid numeric data, PROS_SCRN_ID='MED' , at line 17352 column 201.
我认为是因为我没有在比较之前初始化数组,因此将其视为数字数组。但是,我将格式指定为$ 4。为什么会抛出错误?
此外,我不确定这是否是在数组中获取唯一值的最佳方法。有没有更好的方法来实现这一点?
答案 0 :(得分:0)
您的代码似乎正在按组收集唯一值,从一个高数据结构到一个宽数据结构。
最清晰的DATA步骤方法之一是使用我们称为DOW循环的方式,其中SET位于循环内。该示例代码假定每个组不超过10个唯一卫星值。 (by
变量可以被视为 key 变量,而其他所有变量都是 satellites )
data have;
input user_id screen_id ;
datalines;
1 1
1 2
1 1
1 1
1 1
1 3
2 1
2 1
2 1
3 0
4 1
4 2
4 3
5 11
5 11
5 11
5 5
5 1
5 5
5 6
5 1
run;
data want;
_index = 0;
do until (last.user_id);
set have;
by user_id;
array ids screen_id1-screen_id10;
if screen_id not in ids then do;
_index + 1;
ids(_index) = screen_id;
end;
end;
drop _index screen_id;
run;
一种最清晰的程序方法是选择唯一值并将它们转置。
proc sql;
create view uniqueScreenByUser as
select distinct user_id, screen_id
from have
order by user_id
;
proc transpose data=uniqueScreenByUser prefix=screen_id out=wantWide(drop=_name_);
by user_id;
var screen_id;
run;