gpt4 book ai didi

SAS 数据步骤计算图中的节点/边

转载 作者:行者123 更新时间:2023-12-03 23:11:58 26 4
gpt4 key购买 nike

假设我有一个有向图,用名为links的数据集表示,它有两个变量:from_idto_id。我想使用 SAS Data Step 来做两件事:(1) 计算节点数,(2) 计算边数。

假设 links 数据集如下所示。

from_id    to_id
----------------
1 2
2 3
3 1
3 2

在这个例子中,有 3 个节点和 4 个边。 (我们可以假设链接中没有重复边)。节点为1、2、3,边为1->2、2->3、3->1、3->2。

下面是一个 SAS 宏,它结合使用 SAS Data Step 和 proc sql 来计算节点和边。它工作得很好,但我希望使用 SAS Data Step 以便可以(可能)更快地完成对节点和边的计数。

/* display number of nodes and edges for graph */
%macro graph_info(links);
data nodes;
set &links;
node_id = from_id;
output;
node_id = to_id;
output;
keep node_id;
run;

proc sql noprint;
select count(distinct node_id) into :numNodes from nodes;
quit;
proc datasets lib=work nolist;
delete nodes;
quit;

proc sql noprint;
select count(*) into :numEdges from &links;
quit;

%put Nodes: &numNodes;
%put Edges: &numEdges;
%mend;

最佳答案

如果您有足够的内存,您可以使用散列对象来完成此操作。

请注意:此代码未经测试,因为我手边没有 SAS 安装。但是,基本思想应该可行。您遍历数据步骤,将每个节点添加到哈希对象,并在最后一个对象上将宏变量设置为哈希对象的大小。

data _null_;
set links end=lastrec;
format node_id 8.;
if _N_ eq 1 then do;
declare hash h();
h.defineKey("node_id");
h.defineDone();
end;
node_id = from_id;
rc=h.find();
if rc ne 0 then h.add();
node_id = to_id;
rc=h.find();
if rc ne 0 then h.add();
if lastrec then do;
call symput('numLinks', put(h.num_items, 8. -L));
call symput('numEdges', put(_N_, 8. -L));
end;
run;

关于SAS 数据步骤计算图中的节点/边,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13315152/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com