通过为SAS中的先前obs创建新变量,将事务数据集折叠到一个obs中

时间:2014-04-07 18:57:17

标签: sas

我想知道,如果有人有一种快速简便的方法将事务数据折叠成一个观察点以便于建模处理。

例如,假设我们看一下与客户的谈判,每条记录都是某个车型的报价,带有选项A,B和C(所有名义指标)。最后一条记录显示出售。

DATA TEMPSET; 
    INPUT  CUST_ID $ A $ B $ C $;
    DATALINES; 
        01  1   0   3
        01  1   1   0
        01  1   1   3
        01  0   1   3
        02  0   0   2
        02  1   0   2
        02  1   1   2
        02  1   2   2
        02  0   2   2
        ;
RUN; 

为了使事情变得更容易,我希望得到一个结果数据集:

CUST_ID A   B   C   A-1 B-1 C-1 A-2 B-2 C-2 A-3 B-3 C-3 A-4 B-4 C-4
01      1   0   3   1   1   0   1   1   3   0   1   3    .  .   .
02      0   0   2   1   0   2   1   1   2   1   2   2   0   2   2

我的方法是创建变量的二维数组。但后来我无法将它与DO循环结合,尝试分配赋值,因为它有多个obs。我还尝试使用带有SYMPUT / SYMGET的宏变量,然后使用LAST.CUst_ID = 1来触发输出,仍然存在不一直具有相同长度的引用历史以及需要对每个变量进行硬编码的问题,这对于三个变量,但没有数量增加。欢迎提出任何建议,可能更简单的方式使用PROC SQL吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

PROC TRANSPOSE是您的朋友。创建具有所需名称和值的垂直数据集,并进行转置。

DATA TEMPSET; 
    INPUT  CUST_ID $ A $ B $ C $;
    DATALINES; 
        01  1   0   3
        01  1   1   0
        01  1   1   3
        01  0   1   3
        02  0   0   2
        02  1   0   2
        02  1   1   2
        02  1   2   2
        02  0   2   2
        ;
RUN; 

data tempset_i;
set tempset;
by cust_id;
if first.cust_id then row=0;
row+1;
array vars a b c;
do _i = 1 to dim(vars);
  varname = cats(vname(vars[_i]),row);
  value = vars[_i];
  output;
end;
keep cust_id varname value;
run;

proc transpose data=tempset_i out=tempset_t(drop=_name_);
by cust_ID;
id varname;
var value;
run;