扩展列表以包括 SAS 中的因子转换
extend list to include factor transforms in 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;
但是没有用,有没有办法扩展我的列表并附加正确的短语?
首先,字符串文字需要用引号引起来。所以你想使用 '_sq'
而不是 _sq
。如果没有引号,SAS 将假定 _sq
是变量的名称。
SAS 字符变量也是固定长度的,因此使用简单的连接运算符 ||
在空格后附加后缀。然后尝试将结果写回同一个变量将丢失后缀,因为它不适合变量。
您不需要为此使用 BY 处理。您正在将每一行扩展为多行。
data want;
set have;
output;
length suffix ;
do suffix='log','sq';
id = catx('_',id,suffix);
label = catx('_',label,suffix);
output;
end;
drop suffix;
run;
如果您不想保留原始观察结果,请删除 do
循环之前的 output
语句。
@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;
我有这样的数据集
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;
但是没有用,有没有办法扩展我的列表并附加正确的短语?
首先,字符串文字需要用引号引起来。所以你想使用 '_sq'
而不是 _sq
。如果没有引号,SAS 将假定 _sq
是变量的名称。
SAS 字符变量也是固定长度的,因此使用简单的连接运算符 ||
在空格后附加后缀。然后尝试将结果写回同一个变量将丢失后缀,因为它不适合变量。
您不需要为此使用 BY 处理。您正在将每一行扩展为多行。
data want;
set have;
output;
length suffix ;
do suffix='log','sq';
id = catx('_',id,suffix);
label = catx('_',label,suffix);
output;
end;
drop suffix;
run;
如果您不想保留原始观察结果,请删除 do
循环之前的 output
语句。
@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;