我希望使用数据步骤将数据从长格式转换为宽格式。问题是由于缺少值,值不会放在正确的单元格中。我认为要解决问题,我必须包含缺失值的占位符。
问题是我不知道该怎么做。有人可以给我一些关于如何去做的提示。
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;
它解决了这个问题。
答案 0 :(得分:0)
从高和瘦到短和宽的数据转换通常意味着分类数据最终成为列名。这是一个将数据移动到元数据的过程,这可能是以后处理BY或CLASS组的问题。
SAS有Proc TABULATE和Proc REPORT用于创建旋转输出。 Proc TRANSPOSE也是创建数据透视数据的一种很好的标准方法。
我注意到你一次转动两列。 TRANSPOSE不能多轴。您展示的DATA Step方法是当索引位于已知范围内时进行转置变换的典型方法。在您的情况下,数组声明必须是' direct-addressing' via index可以处理在所有数据上发生的最小和最大月份值。