SAS:使用循环创建许多数据集并重命名变量

时间:2013-05-07 13:15:03

标签: arrays sas

我有一个长格式的数据集,例如:

time    subject var1    var2    var3
1   1   0.41    0.48    0.85
2   1   0.58    0.38    0.15
3   1   0.08    0.39    0.96
4   1   0.58    0.87    0.15
5   1   0.55    0.40    0.67
1   2   0.76    0.49    0.03
2   2   0.36    0.26    0.93
3   2   0.83    0.88    0.63
4   2   0.19    0.65    0.99
5   2   0.89    0.91    0.47

我想以宽格式获取数据集

time var1_sub1 var2_sub1 var3_sub1 var1_sub2 var2_sub2 var3_sub2
1    0.41      0.48      0.85      0.76      0.49      0.03
2    0.58      0.38      0.15      0.36      0.26      0.93
3    0.08      0.39      0.96      0.83      0.88      0.63
4    0.58      0.87      0.15      0.19      0.65      0.99
5    0.55      0.40      0.67      0.89      0.91      0.47

到目前为止,我想出了以下列方式做到这一点的想法:

data data_sub1;
set data;
if subject=1;
var1_sub1=var1;
var2_sub1=var2;
var3_sub1=var3;
run;

data data_sub2;
set data;
if subject=2;
var1_sub2=var1;
var2_sub2=var2;
var3_sub2=var3;
run;

proc sort data=data_sub1;
by time;
run;

proc sort data=data_sub2;
by time;
run;

data datamerged;
merge data_sub1 data_sub2;
by time;
run;

它有效,一切都很好,但我想学习如何以更美丽的方式编码它,就像在实践中我有更多的主题和变量。

1 个答案:

答案 0 :(得分:2)

这是PROC TRANSPOSE问题。要解决大多数PROC TRANSPOSE问题,请将其完全垂直(每行一个值 - 一个变量名称),然后使用ID语句进行转置。

data have;
input time    subject var1    var2    var3;
datalines;
1   1   0.41    0.48    0.85
2   1   0.58    0.38    0.15
3   1   0.08    0.39    0.96
4   1   0.58    0.87    0.15
5   1   0.55    0.40    0.67
1   2   0.76    0.49    0.03
2   2   0.36    0.26    0.93
3   2   0.83    0.88    0.63
4   2   0.19    0.65    0.99
5   2   0.89    0.91    0.47
;;;;
run;

data have_vert;
set have;
array vars var:;
do _t = 1 to dim(vars);
  id=cats(vname(vars[_t]),'_','sub',subject);  *this is our future variable name;
  value = vars[_t];                            *this is our future variable value;
  output;
end;
keep time id value subject;
run;
proc sort data=have_vert;
by time subject id;
run;
proc transpose data=have_vert out=want;
by time;
var value;
id id;
run;