从SAS中的数据集创建邻接矩阵

时间:2015-01-08 19:02:59

标签: sql sas

我一直在拼命地从数据集创建一个邻接矩阵(我在R中有等价物),但是在SAS(初学者熟练度)中无法做到这一点。如果你可以帮助我,这将是非常有帮助的。另外,请建议SAS(没有SNA)是否可以使用稀疏矩阵?

data test;
input id id_o;
cards;
100 300
600 400
200 300
100 200
;
run;

我找到了所有唯一id和id_o的联合来创建列表

proc sql;
create table test2 as
select distinct id from
  (select id as id from test
   union all
   select id_o as id from test);
quit;

Test2看起来像

100 600 200 300 400

现在我想要一个邻接矩阵,当Test2(100和原始数据集中的id_o(300)之间存在链接时,该矩阵在一个位置分配1)。将Test2视为i,并且在相应的j处有1。

因此,邻接矩阵看起来像

    100 600 200 300 400
100  0   0   1   1  0
600  0   0   0   0  1
200  0   0   0   1  0
300  0   0   0   0  0
400  0   0   0   0  0

1 个答案:

答案 0 :(得分:1)

这是一种方法,扩展您当前的代码。首先,您需要创建一个包含所有选项的空表,然后填写1/0。第二,将表转换为所需的格式。 可能有一种方法可以用proc距离或其他一些过程来做到这一点,但我不确定。

*get all the 1's for matrix;
proc freq data=test;
table id*id_o/sparse out=dist1;
run;

*Fill into matrix with all options;
proc sql;
create table test3 as
select a.id, b.id as id_o, coalesce(c.count, 0) as count
from test2 as a
cross join test2 as b
left join dist1 as c
on a.id=c.id
and b.id=c.id_o
order by a.id, b.id;
quit;

*Transpose to desired format.
proc transpose data=test3 out=test4 prefix=id_;
by id;
id id_o;
var count;
run;