1

我有一个这样的数据集

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;

但无济于事,有没有办法扩展我的列表并附加正确的短语?

4

2 回答 2

1

首先是字符串文字需要用引号引起来。所以你想使用'_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

于 2018-11-09T15:02:55.753 回答
0

@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;
于 2018-11-09T16:11:50.823 回答