расширить список для включения факторных преобразований в SAS - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть такой набор данных

data have;
input ID Label;
datalines;
Factor_1 Assets
Factor_2 Liabilities
Factor_3 Bonds
;
run;

Я хочу создать новый набор данных для преобразования фактора, и мне нужно будет обновить свой словарь как таковой

data want;
input ID Label;
datalines;
Factor_1_log Assets_log
Factor_1_sq Assets_sq
Factor_2_log Liabilities_log
Factor_2_sq liabilities_sq
;
run;

Я пробовал это до сих пор

data want;
set have;
by ID;
if first.ID then do;
output;
ID = ID||_log;
output;
ID = ID||_sq;
output;
end;
run;

Но безрезультатно, есть ли способ расширить мой список и добавить правильную фразу?

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

@ Том - лучший, просто еще один способ сделать в SQL

proc sql;
create table want as 
 select cats(id,newcol) as id, cats(label,newcol) as label from 
       (select * from have)a
        cross join
       (select distinct '_log' as newcol from have
       union 
       select distinct '_sq' as newcol from have)b;
0 голосов
/ 09 ноября 2018

Во-первых, строковые литералы должны быть в кавычках.Итак, вы хотите использовать '_sq' вместо _sq.Без кавычек SAS будет предполагать, что _sq является именем переменной.

Также символьные переменные SAS имеют фиксированную длину, поэтому с помощью простого оператора конкатенации || добавьте суффикс после пробелов.Тогда попытка записать результат обратно в ту же переменную потеряет суффикс, поскольку он не будет помещаться в переменную.

Вам не нужно использовать обработку BY для этого.Вы расширяете каждую строку на несколько строк.

data want;
  set have;
  output;
  length suffix $8 ;
  do suffix='log','sq';
    id = catx('_',id,suffix);
    label = catx('_',label,suffix);
    output;
  end;
  drop suffix;
run;

Если вы не хотите сохранять исходные наблюдения, удалите оператор output перед циклом do.

...