SAS - неверные числовые данные при поиске в массиве - PullRequest
0 голосов
/ 27 февраля 2019

Я пытаюсь создать массив строк и хочу вставить в него значение, если оно еще не существует в массиве.

Я где-то читал, что мы можем использовать оператор IN с Array,Итак, закодировал это следующим образом:

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 голосов
/ 27 февраля 2019

Ваш код, по-видимому, собирает уникальные значения по группам, превращаясь из высокой структуры данных в широкую структуру данных.

Один из самых ясных способов шага DATA - использовать то, что мы называем циклом DOW, в котором SET находится внутри цикла.Этот пример кода предполагает не более 10 уникальных спутниковых значений на группу.(Переменные by можно рассматривать как ключевые переменные, а все остальные переменные будут спутники )

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...