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 の問題を解決するには、完全に垂直 (行ごとに 1 つの値と 1 つの変数名) にしてから、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 に答える