我有一个SAS数据集,如下所示:
Month Col1 Col2 Col3 Col4
200801 11 2 3 20
200802 5 9 4 10
. . . . .
. . . . .
. . . . .
201212 3 34 1 0
我想通过将每行的Col1-Col4值移到右侧来创建数据集。它看起来会对角移动。
Month Col1 Col2 Col3 Col4 Col5 Col6 Col7 . . . . . . . Coln
200801 11 2 3 20
200802 . 5 9 4 10
. . . . .
. . . . .
. . . . .
201212 . . . . . . . . . 3 34 1 0
有人可以建议我怎么做吗?
谢谢!
答案 0 :(得分:0)
首先,如果你可以避免这样做,那就去做吧。这是一种非常稀疏的存储数据方式,并且涉及大型数据集(至少使用OPTIONS COMPRESS),通常可以很好地利用CLASS变量。
如果你真的必须这样做,PROC TRANSPOSE
是你的朋友。虽然这在数据步骤中是可行的,但在PROC TRANSPOSE中它不那么混乱和灵活。
首先,制作一个完全垂直的数据集(月份+ colname + colvalue):
data pre_t;
set have;
array cols col1-col4;
do _t = 1 to dim(cols);
colname = cats("col",((_N_-1) + _t)); *shifting here, edit this logic as needed;
value = cols[_t];
output;
keep colname value month;
run;
在该datastep中,您将在colname
中创建最终列名并将其设置为转置。如果您的数据与上述数据不同(特别是,如果您将数据按其他方式分组), N 可能无效,您可能需要做一些逻辑(例如找出与200801的差异) )计算col#。
然后,proc转置:
proc transpose data=pre_t out=want;
by month;
id colname;
var value;
run;
瞧,你应该拥有你想要的东西。确保它已正确排序,以便按预期顺序获得输出。