0

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

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;

它可以工作,一切都很好,但我想学习如何以更漂亮的方式对其进行编码,因为在实践中我有更多的主题和变量。

4

1 回答 1

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;
于 2013-05-07T13:50:19.913 回答