我正在尝试创建一个双向转置表。原来我看起来像
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%。
答案 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;