双向转置SAS表

时间:2015-04-01 16:10:08

标签: sas proc

我正在尝试创建一个双向转置表。原来我看起来像

id      cc
1       2
1       5
1       40
2       55
2       2
2       130
2       177
3       20
3       55
3       40
4       30
4       100

我正在尝试创建一个看起来像

的表
CC        CC1     CC2…  …CC177
1         264     5        0
2         0      132       6
…
…
177       2        1      692

换句话说,有多少id cc1也有cc2..cc177..etc

ID下的数字不计算在内; ID可以是3位数到5位数ID,也可以是122345ab78

等数字

是否可以将百分比显示在彼此旁边?

    CC        CC1 %    CC2    %…  …CC177
1          264 100%   5 1.9%        0
2           0         132           6
…
…
177         2              1       692

如果我想将CC1 CC2更改为字符,我该如何修改数组? 最终,我希望我的表看起来像

CC     Dell Lenovo HP Sony
Dell
Lenovo
HP
Sony

名称的顺序必须与我在上面提供的CC编号相匹配。 CC1 =戴尔CC2 =联想等。我还想在matrice中添加百分比。如果Dell X Dell = 100且Dell X Lenovo = 25,则Dell X Lenovo = 25%。

1 个答案:

答案 0 :(得分:4)

这会将您的数据结构更改为宽格式,并为每个CC值指示,然后使用proc corr(correlation)创建汇总表。

Proc Corr将生成SCCP - 这是未校正的平方和交叉积之和。这与相关性有关,但要点是它创造了你正在寻找的表格。该表在SAS结果窗口中输出,ODS OUTPUT语句将捕获名为coocs的数据集中的表。

data temp;
set have;
by ID;
retain CC1-CC177;
array CC_List(177) CC1-CC177;

if first.ID then do i=1 to 177;
   CC_LIST(i)=0;
end;

CC_List(CC)=1;

if last.ID then output;

run;


ods output sscp=coocs;
ods select sscp;
proc corr data=temp sscp;
var CC1-CC177;
run;
proc print data=coocs;
run;

这是另一个答案,但它效率低下并且存在问题。例如,如果值不在列表中的任何位置,它将不会显示在结果中,即如果数据集中没有20,则最终数据中将不存在20。此外,变量在最终数据集中无序。

proc sql;
create table bigger as
select a.id, catt("CC", a.cc) as cc1, catt("CC", b.cc) as cc2
from have as a
cross join have as b
where a.id=b.id;
quit;

proc freq data=bigger noprint;
table cc1*cc2/ list out=bigger2;
run;

proc transpose data=bigger2 out=want2;
by cc1;
var count;
id cc2;
run;