将列移到右侧

时间:2014-03-21 19:45:12

标签: sas

我有一个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

有人可以建议我怎么做吗?

谢谢!

1 个答案:

答案 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;

瞧,你应该拥有你想要的东西。确保它已正确排序,以便按预期顺序获得输出。