3

とという2 つの変数を持つという名前のデータセットで表される有向グラフあるとします。SAS Data Step を使用して、(1) ノードの数を数え、(2) エッジの数を数えます。linksfrom_idto_id

データlinksセットが次のようになっているとします。

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

この例では、3 つのノードと 4 つのエッジがあります。( には重複するエッジがないと仮定できます)links。ノードは 1、2、3 です。エッジは 1->2、2->3、3->1、3->2 です。

以下は、ノードとエッジをカウントするために SAS Data Step を proc sql と組み合わせて使用​​する SAS マクロです。それは完全に機能しますが、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;
4

1 に答える 1

5

十分なメモリがある場合は、ハッシュ オブジェクトを使用してこれを実行できる場合があります。

注意: このコードはテストされていません。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;
于 2012-11-09T20:27:08.140 に答える