SAS Создать новые переменные - PullRequest
       13

SAS Создать новые переменные

0 голосов
/ 12 декабря 2018

Я хотел бы создать новые переменные «Вес» и «Рост», используя переменные от А до D:

DATA: 
A       B     C    D       
Jim  Weight  180   Screen
Jim  Weight  200   C1
Jim  Height  60    Screen
Jim  Height  61    C3
Tod  Weight  190   Screen
Tod  Weight  201   C1
Tod  Height  70    Screen
Tod  Height        C1

Переменная «Вес» будет иметь следующие критерии: Установите «Вес» для столбца «С», если столбец «Столбец»B = вес, столбец D = C1 и столбец C не пропущен.В противном случае, если столбец D не является C1 или отсутствует столбец C, используйте столбец C, где столбец D - экран.Говоря простым языком, скажем, Джим был взвешен во время скрининга, а не для С1, тогда я бы хотел сохранить его вес на экране.Или, если он был показан на С1, но уайт отсутствует, я бы хотел сохранить его вес на экране.Аналогично для переменной высоты.

Мой неправильный код:

DATA MYTEST; 
    SET TEST.TEST; 
    if B = 'WEIGHT' and D = 'C1D1' and not missing(C) then NEW = C;
    else if (missing(C) or D ~= 'C1') and B = 'WEIGHT' then WEIGHT = C where D = 'Screen';
    if B = 'HEIGHT' and D = 'C1D1' and not missing(C) then NEW = C;
    else if (missing(C) or D ~= 'C1') and B = 'HEIGHT' then WEIGHT = C where D = 'Screen';
    else WEIGHT = 'NA';
 RUN; 
 PROC PRINT DATA = MYTEST; 
 RUN; 

Желаемый результат:

DATA: 
A    Weight   Height 
Jim   200       60
Tod   201       70

1 Ответ

0 голосов
/ 12 декабря 2018

Данные результата могут быть созданы с помощью оператора update, примененного к данным после транспонирования.UPDATE отличается от MERGE в этом отношении - пропущенные значения в наборе данных обновления никогда не перезапишут существующее значение в PDV.

DATA have;
input 
a $  b $     c     d $; datalines;
Jim  Weight  180   Screen
Jim  Weight  200   C1
Jim  Height  60    Screen
Jim  Height  61    C3
Tod  Weight  190   Screen
Tod  Weight  201   C1
Tod  Height  70    Screen
Tod  Height  .     C1
run;

proc transpose data=have out=haveT;
  by a d notsorted;
  var c;
  id b;
run;

data haveScreen / view=haveScreen;
  set haveT;
  where d='Screen';
  by a;
  if first.a;
run;

data want;
  update
    haveScreen
    haveT (where=(d in ('Screen', 'C1')))
  ;
  by a;
run;

Ваш опубликованный код не использует WHERE правильно.Где условия не применяются условно и также не могут быть изменены динамически во время выполнения шага данных.Предложение where применяется во время запуска инициализации.Предложение where является неисполняемым / безусловным оператором, а последний встречающийся в коде шага данных - это тот, который будет применяться при выполнении шага.

Например, в следующем примере if 0никогда не соответствует истине where применяется независимо.

options msglevel=i;
data _null_;
  set sashelp.class;
  if name =: 'X' then where age > 12;
  if 0 then where age > 1;
run;
----- LOG -----
4625  options msglevel=i;
4626  data _null_;
4627    set sashelp.class;
4628    if name =: 'X' then where age > 12;
4629    if 0 then where age > 1;
NOTE: WHERE clause has been replaced.
4630    run;

NOTE: There were 19 observations read from the data set SASHELP.CLASS.
      WHERE age>1;
...