从 SAS 中的数据集创建邻接矩阵
Create adjacency matrix from dataset in 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;
测试2看起来像
100
600
200
300
400
现在我想要一个邻接矩阵,它在 Test2(来自原始数据集的 100 和 id_o (300))之间存在 link 时在某个位置分配 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
这是一种扩展当前代码的方法。首先,您需要创建一个包含所有选项的空 table,然后填写 1/0。其次将 table 转换为所需的格式。
可能有一种方法可以通过 proc distance 或其他一些 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;
我一直在拼命地尝试从数据集创建邻接矩阵(我在 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;
测试2看起来像
100 600 200 300 400
现在我想要一个邻接矩阵,它在 Test2(来自原始数据集的 100 和 id_o (300))之间存在 link 时在某个位置分配 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
这是一种扩展当前代码的方法。首先,您需要创建一个包含所有选项的空 table,然后填写 1/0。其次将 table 转换为所需的格式。 可能有一种方法可以通过 proc distance 或其他一些 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;