Расширить список для включения факторных преобразований в SAS
У меня есть такой набор данных
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 ответа
Во-первых, строковые литералы должны быть в кавычках. Итак, вы хотите использовать '_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
петля.
@Tom - лучший способ, просто еще один способ сделать это в 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;