【问题标题】:SAS Adjacency Matrix CreationSAS 邻接矩阵创建
【发布时间】:2016-12-21 19:07:22
【问题描述】:

我创建了这个表:

从这个我想创建一个邻接矩阵来显示有多少employee_id 的表共享。它看起来像这样(我认为): 我不确定我是否以正确的方式解决这个问题。我想我可能做错了。我知道如果我有更多 SAS 产品,这可能会更容易,但我只有基本的 SAS 企业指南可以使用。

非常感谢您的帮助。谢谢你。

【问题讨论】:

  • 最后一列/行是如何确定的?

标签: sas social-networking adjacency-list adjacency-matrix sna


【解决方案1】:

这是使用 PROC CORR 的另一种方式,它仍然比上述解决方案更好。而且您不需要过滤 - 变量无关紧要,您只需在 PROC CORR 过程中指定它们。

data id;
input id:$4. human alien wizard;
cards;
1005 1 1 0
1018 0 0 1
1022 0 0 1
1024 1 0 0
1034 0 1 0
1069 0 1 0
1078 1 0 0
1247 1 1 1
;;;;
run;

ods output sscp=want;
proc corr  data=id  sscp ;
    var human alien wizard;
run;

proc print data=want;
    format _numeric_ 8.;
run;

结果是:

                   Obs    Variable       human       alien      wizard

                   1      human             4           2           1
                   2      alien             2           4           1
                   3      wizard            1           1           3

【讨论】:

  • 谢谢!我不知道会这样做。
【解决方案2】:

我认为这是您想要的,但它并没有给出您显示的答案。

data id;
   input id:$4. human alien wizard;
   cards;
1005 1 1 0
1018 0 0 1
1022 0 0 1
1024 1 0 0
1034 0 1 0
1069 0 1 0
1078 1 0 0
1247 1 1 1
;;;;
   run;

proc corr noprint nocorr sscp out=sscp;
   var human alien wizard;
   run;
proc print;
   run;

【讨论】:

  • 这不包括最后一列/行。在这种情况下,ODS 表更接近所需的输出。
  • 非常感谢,非常感谢您的帮助。我可以看到现在有很多方法可以做到这一点。
【解决方案3】:

我能够使用这个得到答案,尽管它不包括我想要的最后一个单元格(human_alien_wizard):

proc transpose data=FULL_JOIN_ALL3 out=FULL_JOIN_ALL3_v2;
  by employee_id;
  var human_table alien_table wizard_table;
run; 

proc sql;
  create table FULL_JOIN_ALL3_v3 as
  select distinct a._name_ as anm,b._name_ as bnm,
  count(distinct case when a.col1=1 and b.col1=1 then a.employee_id else . end) as smalln
  from FULL_JOIN_ALL3_v2 a, FULL_JOIN_ALL3_v2 b
  where a.employee_id=b.employee_id
  group by anm,bnm
; 

proc tabulate data=FULL_JOIN_ALL3_v3;
 class anm bnm;
 var smalln;
 table anm='',bnm=''*smalln=''*sum=''*f=best3. / rts=5;
run;

【讨论】:

  • 你走了很长一段路。你可以直接从 PROC CORR SSCP 得到同样的东西。
  • 使用你的方法我仍然需要子集,但是是的,你的方法更短。我只需要弄清楚我是否要创建一个自动脚本,有人可能仍然需要查看数据以在正确的行和列上进行子集化,并且每次可能都是不同的变量名,因此需要一个宏变量我相信为此而创建的。这是子集代码。
  • /*Proc CORR Method*/ proc corr data=FULL_JOIN_ALL3 noprint nocorr sscp out=sscp; run; DATA Adjacency_Matrix (KEEP=Tables human_table alien_table wizard_table); SET sscp (rename=(_name_=Tables)); If (Tables = 'Intercept' or Tables = 'employee_id') THEN DELETE; IF (_TYPE_ = 'SSCP') THEN OUTPUT; RUN; proc print data=Adjacency_Matrix; run;
  • @hope288 如果将变量添加到 PROC CORR,您只会过滤掉截距和空白。请注意,您仍然在流程(first_step)中输入一次变量,因此它不再像其他解决方案那样自动化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-02
  • 1970-01-01
相关资源
最近更新 更多