Поиск SAS на основе переменной - PullRequest
2 голосов
/ 19 июня 2019

У меня есть две таблицы в SAS, таблица A и таблица B. Предположим, я хочу написать небольшой код SAS, чтобы получить таблицу «Желаемый вывод».Как мне это сделать?

Таблица A:

Observation  Var1   Var2
1            0      0
2            1      2
3            2      1
4            0      0

Таблица B:

Var     Level   Lookup
Var1    0       0.1
Var1    1       0.3
Var1    2       0.5
Var2    0       0.7
Var2    1       0.8
Var2    2       0.9

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

Observation Var1    Var2    Var1_new    Var2_new
1           0       0       0.1         0.7
2           1       2       0.3         0.9
3           2       1       0.5         0.8
4           0       2       0.1         0.9

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

data DATA_OUT.DESIRED_OUTPUT;
set DATA_IN.TABLE_A;
set PP.TABLE_B key=(Var Level);

Var1_new = TABLE_B["Var1" Var1][Lookup];
Var2_new = TABLE_B["Var2" Var2][Lookup];
run;

Как бы вы достигли желаемого результата в SAS?

Ответы [ 2 ]

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

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

data A ;
 input var1 var2;
cards;
0 0
1 2
2 1
0 0
;    
data B;
  input Var :$32. Level Lookup;
cards;
Var1 0 0.1
Var1 1 0.3
Var1 2 0.5
Var2 0 0.7
Var2 1 0.8
Var2 2 0.9
;

data want;
  if _n_=1 then do;
    if 0 then set b;
    dcl hash h(dataset: 'b');
    h.definekey('var','level');
    h.definedata('lookup');
    h.definedone();
  end;
  set a;
  h.find(key:'Var1',key:var1);
  lookup1=lookup;
  h.find(key:'Var2',key:var2);
  lookup2=lookup;
  drop var level lookup;
run;
1 голос
/ 20 июня 2019

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

Форматы - это просто отношения между одним значением и другим значением, и это именно то, что у вас здесь есть! Вы используете опцию CNTLIN в PROC FORMAT, чтобы создать отношение из набора данных (ваш набор данных B), а затем применить его, используя PUT. (Затем используйте INPUT, чтобы вернуться к числу - форматы создают только символьные значения. Вы не можете использовать INFORMAT здесь, потому что они принимают только символьные значения в качестве ввода. Число к номеру всегда делает дополнительный шаг.)

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

data a;
input Observation  Var1   Var2;
datalines;
1            0      0
2            1      2
3            2      1
4            0      0
;;;;
run;

data b;
input Var $  Level   Lookup;
datalines;
Var1    0       0.1
Var1    1       0.3
Var1    2       0.5
Var2    0       0.7
Var2    1       0.8
Var2    2       0.9
;;;;
run;

*Here we make a new dataset that has the required names for a format cntlin dataset;
data for_fmt;
  set b;
  rename var=fmtname 
         level=start
         lookup=label
  ;
  var = cats(var,'F');  *format names cannot end with numbers, so add an F at the end;
run;
proc format cntlin=for_fmt;  *read in the format;
quit;

*now use the formats;
data want;
  set a;
  var1_new = input(put(var1,var1f.),best12.);
  var2_new = input(put(var2,var2f.),best12.);
run;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...