在SAS中创建对角线

时间:2016-02-09 11:50:16

标签: sas

我正在尝试使用SAS将我的列转换为对角线。

例如

D C1 C2 C3 C4 C5
J 11 00 14 15 20
F 00 13 16 00 30
M 00 00 18 19 00
A 00 00 00 98 50
S 00 00 00 00 41

希望将其转换为

D N1 N2 N3 N4 N5
J 11 00 14 15 20
F 13 16 00 30
M 18 19 00
A 98 50
M 41

有人可以告诉或帮助我吗?

1 个答案:

答案 0 :(得分:3)

基于新信息更新:这只是使用一个数组来移动从对角线到左边的值。不依赖于下三角形中的值。

data havethis;
   infile cards firstobs=2;
   input D:$1. C1-C5;
   cards;
D C1 C2 C3 C4 C5
J 11 00 14 15 20
F 00 13 16 00 30
M 00 00 18 19 00
A 00 00 00 98 50
S 00 00 00 00 41
;;;;
   run;
data want;
   set havethis;
   array c[*] c:;
   array N[&sysnobs];
   j = 0;
   do i = _n_ to dim(c);
      j + 1;
      n[j] = c[i];
      end;
   drop j i;
   run;

enter image description here

这种方法使用两个转置(翻转/翻转),它假设只有零在对角线上(如果它们丢失则更好)并且缺少你得到的结果。我喜欢这种方法,因为你不需要知道任何东西,比如多少。

data havethis;
   input D:$1. C1 C2 C3;
   format c: z2.;
   cards;
J 11 12 14
M 00 13 15
A 00 00 16
;;;;
   run;
proc transpose data=havethis out=wantthis(drop=_name_ where=(col1 ne 0));
   by D notsorted;
   run;
proc transpose data=wantthis out=whatthismore(drop=_name_) prefix=N;
   by d notsorted;
   run;

enter image description here