在SAS中,我有一个类似于下面的数据集。
ID TRACT meanFA sdFA medianFA
1 t01 0.56 0.14 0.56
1 t02 0.53 0.07 0.52
1 t03 0.71 0.08 0.71
2 t01 0.72 0.09 0.72
2 t02 0.83 0.10 0.86
2 t03 0.59 0.10 0.62
我不确定转置是否是正确的概念......但我希望数据看起来像下面那样。
ID t01_meanFA t01_sdFA t01_medianFA t02_meanFA t02_sdFA t02_medianFA t03_meanFA t03_sdFA t03_medianFA
1 0.56 0.14 0.56 0.53 0.07 0.52 0.71 0.08 0.71
2 0.72 0.09 0.72 0.83 0.10 0.86 0.59 0.10 0.62
proc transpose data=TRACT out=newTRACT;
var meanFA sdFA medianFA;
by id;
id tract meanFA sdFA medianFA;
run;
我一直在玩上面的SAS代码,但没有成功。任何想法或建议都会很棒!
答案 0 :(得分:3)
双重转置就是你如何做到的。将其转换为每个ID每个所需变量有一行的数据集,所以
ID=1 variable=t01_meanFA value=0.56
ID=1 variable=t01_sdFA value=0.14
...
ID=2 variable=t01_meanFA value=0.72
...
然后使用ID = variable和var = value进行转置(或者您选择命名这些列的任何内容)。您可以通过创建值的数组(array vars[3] meanFA sdFA medianFA;
)来创建中间数据集,然后迭代该数组,将变量名称设置为catx('_',tract,vname(vars[n]));
(vname
获取数组元素的变量名称)
答案 1 :(得分:2)
你需要2个转置。转置,使用数据步骤更新_NAME_
变量,然后再转置;
proc transpose data=tract out=tract2;
by id tract;
run;
data tract2;
format _name_ $32.;
set tract2;
_name_ = strip(tract) || "_" || strip(_name_);
run;
proc transpose data=tract2 out=tract3(drop=_name_);
by id;
/*With no ID statement, the _NAME_ variable is used*/
var col1;
run;
答案 2 :(得分:1)
使用此duplicate question中的示例数据。
您也可以通过数据步骤执行此操作。
首先,将最大序列号放入宏变量中。
proc sql;
select
max(sequence_no) into : maxseq
from
have
;
quit;
为新变量创建数组,使用宏变量设置尺寸。然后遍历每次访问,将事件和注释放入各自的变量中。每次访问输出1行。
data want(drop=sequence_no--notes);
do until (last.visit_no);
set have;
by id visit_no;
array event_ (&maxseq);
array notes_ (&maxseq) $;
event_(sequence_no)=event_code;
notes_(sequence_no)=notes;
end;
output;
run;