SAS / Long to Wide,使用数据步骤

时间:2017-10-31 21:36:04

标签: sas sas-macro

我希望使用数据步骤将数据从长格式转换为宽格式。问题是由于缺少值,值不会放在正确的单元格中。我认为要解决问题,我必须包含缺失值的占位符。

问题是我不知道该怎么做。有人可以给我一些关于如何去做的提示。

data tic;

input id country$ month math;

datalines;
1 uk 1 10 
1 uk 2 15 
1 uk 3 24 
2 us 2 15 
2 us 4 12 
3 fl 1 15 
3 fl 2 16 
3 fl 3 17 
3 fl 4 15 
;
run;

proc sort data=tic;
by id;
run;


 data tot(drop=month math);
 retain month1-month4 math1-math4;
 array tat{4} month1-month4;
 array kat{4} math1-math4;
 set tic;

 by id;

 if first.id then do;
    i=1;
    do j=1 to 4;
       tat{j}=.;
       kat{j}=.;
    end;
end;

tat(i)=month;
kat(i)=math;

if last.id then output;

i+1;

run;

编辑 我终于弄清楚问题是什么:

更改了这行代码

tat(i)=month;
kat(i)=math;

为:

tat(month)=month;
kat(month)=math;

它解决了这个问题。

1 个答案:

答案 0 :(得分:0)

从高和瘦到短和宽的数据转换通常意味着分类数据最终成为列名。这是一个将数据移动到元数据的过程,这可能是以后处理BY或CLASS组的问题。

SAS有Proc TABULATE和Proc REPORT用于创建旋转输出。 Proc TRANSPOSE也是创建数据透视数据的一种很好的标准方法。

我注意到你一次转动两列。 TRANSPOSE不能多轴。您展示的DATA Step方法是当索引位于已知范围内时进行转置变换的典型方法。在您的情况下,数组声明必须是' direct-addressing' via index可以处理在所有数据上发生的最小和最大月份值。