Создать новую переменную на основе условий для нескольких переменных в SAS - PullRequest
2 голосов
/ 28 июня 2019

Я хотел бы создать новую переменную "тип", основанную на истинности условий для нескольких переменных, но у меня слишком много переменных (~ 100) для ввода. Я использую SAS Studio v 9.4.

Мои данные настроены примерно так:

DATA have;
    INPUT id  
    a_var_a a_var_b a_var_c a_var_d a_var_e
    b_var_a b_var_b b_var_c b_var_d
    c_var_a c_var_b c_var_c d_var_d;
    DATALINES;
          01 1 0 0 0 0 0 0 0 0 0 0 0 0
          02 0 1 0 0 0 0 0 0 0 0 0 0 0
          03 0 0 1 0 0 0 0 0 0 0 0 0 0
          04 0 0 0 1 0 0 0 0 0 0 0 0 0
          05 0 0 0 0 1 0 0 0 0 0 0 0 0
          06 0 0 0 0 0 1 0 0 0 0 0 0 0
          07 0 0 0 0 0 0 1 0 0 0 0 0 0
          08 0 0 0 0 0 0 0 1 0 0 0 0 0
          09 0 0 0 0 0 0 0 0 1 0 0 0 0
          10 0 0 0 0 0 0 0 0 0 1 0 0 0
          11 0 0 0 0 0 0 0 0 0 0 1 0 0
          12 0 0 0 0 0 0 0 0 0 0 0 1 0
          13 0 0 0 0 0 0 0 0 0 0 0 0 1  
          ;
Run;

«тип» кодируется как:

  • 1 Если любая из групп a vars (a_var :) равна 1
  • 2 Если любая из групп b vars (b_var :) равна 1
  • 3 Если любая из групп c vars (c_var :) равна 1
  • остальное равно 0

Я думал, что это будет так же просто, как:

Data want;
   Set have;

   If a_var: = 1 then type = 1;
   Else If b_var: = 1 then type = 2;
   Else If c_var: = 1 then type = 3;
   Else type = 0;
Run;

Однако я продолжаю получать код ошибки, потому что мне не разрешено группировать переменные.

Я пытался сделать то же самое с массивом, но все еще не могу найти решение:

Data want;
  Set have;

  Array a (*) a_var:;
  Array other (2,4) b_var: c_var:;

  do i = 1 to dim(a);
  If a(i) = 1 then type=1;
  end;

  do i = 1 to 4;
  If other (1,i) = 1 then type=2;
  If other (2,i) = 1 then type=3;
  Else type=0;
  end;

  drop i;
Run;

Я пытаюсь создать 3 категории переменной типа (0,1,2 и 3) в зависимости от того, как выполняются условия.

Ответы [ 2 ]

1 голос
/ 29 июня 2019

Спасибо!

Этот код в конце концов сработал.

DATA have;
  INPUT id

    a_var_a a_var_b a_var_c a_var_d a_var_e
    b_var_a b_var_b b_var_c b_var_d
    c_var_a c_var_b c_var_c c_var_d;

    if whichn (1, of a_var: ) =>1 then type=1;
    else if whichn (1, of b_var: ) =>1 then type=2;
    else if whichn(1, of c_var:) =>1 then type=3;
    else type = 0;
DATALINES;
01 1 0 0 0 0 0 0 0 0 0 0 0 0
02 0 1 0 0 0 0 0 0 0 0 0 0 0
03 0 0 1 0 0 0 0 0 0 0 0 0 0
04 0 0 0 1 0 0 0 0 0 0 0 0 0
05 0 0 0 0 1 0 0 0 0 0 0 0 0
06 0 0 0 0 0 1 0 0 0 0 0 0 0
07 0 0 0 0 0 0 1 0 0 0 0 0 0
08 0 0 0 0 0 0 0 1 0 0 0 0 0
09 0 0 0 0 0 0 0 0 1 0 0 0 0
10 0 0 0 0 0 0 0 0 0 1 0 0 0
11 0 0 0 0 0 0 0 0 0 0 1 0 0
12 0 0 0 0 0 0 0 0 0 0 0 1 0
13 0 0 0 0 0 0 0 0 0 0 0 0 1
14 0 0 0 0 0 0 0 0 0 0 0 0 0
;
Run;
0 голосов
/ 29 июня 2019

Я не думаю, что ярлык prefix: можно использовать для чего-то подобного.

Вместо этого я предлагаю вам использовать макросы для генерации необходимого кода на основе данных DICTIONARY.COLUMNS (см. data)установить имена столбцов в макрос (ы) для примера).

Вы можете сгенерировать условия типа a_var_a=1 or a_var_b=1 or a_var_c=1 or a_var_d=1 or a_var_e=1, используя что-то вроде этого (не проверено):

/* preferably enclose this in a macro and declare the macrovariable as %local mvGroupAIsSet; */
proc sql noprint;
    select cats(name, '=1') into :mvGroupAIsSet separated by ' or '
    from dictionary.columns
    where name like 'a_var_%' /* don't remember if you need to escape the underscores */
      and libname = 'WORK'
      and memname = 'HAVE';
quit;

Затем используйтеэто в вашем шаге DATA:

data want;
   set have;

   if &mvGroupAIsSet then type = 1;
   /* etc */
run;
...