SAS-在数组中搜索时无效的数字数据

时间:2019-02-27 09:32:29

标签: arrays sas

我正在尝试创建一个字符串数组,并希望在其中插入一个值(如果该数组中尚不存在该值)。

我在某处读到可以在数组中使用“ 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。为什么会抛出错误?

此外,我不确定这是否是在数组中获取唯一值的最佳方法。有没有更好的方法来实现这一点?

1 个答案:

答案 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;