楼主: akalius
2476 14

[学习分享] 请教个关于网络问题 [推广有奖]

  • 10关注
  • 3粉丝

已卖:155份资源

讲师

50%

还不是VIP/贵宾

-

威望
0
论坛币
3999 个
通用积分
2.8543
学术水平
4 点
热心指数
6 点
信用等级
6 点
经验
7835 点
帖子
262
精华
0
在线时间
613 小时
注册时间
2009-7-22
最后登录
2025-3-18

楼主
akalius 学生认证  发表于 2018-1-28 14:05:02 |AI写论文
2000论坛币
初始数据是
compacompb
脸书中石化
苹果中石化
ibm苹果
ibm高盛
att德州
德州中石油


意味着 compa 和 compb 连接起来   ,很多节点就构成了一个网络,以上有两个网络,分别是脸书、中石化、苹果、ibm、高盛    和    att  中石油  德州   下面要求每个点所在圈子对应的其他所有点  , 希望得到如下的表格,谢谢

compacompc
脸书中石化
脸书苹果
脸书ibm
脸书高盛
苹果中石化
苹果脸书
苹果ibm
苹果高盛
ibm中石化
ibm脸书
ibm苹果
ibm高盛
高盛中石化
高盛苹果
高盛ibm
高盛脸书
att德州
att中石油
德州att
德州中石油
中石油德州
中石油att


请仔细看看题目再回复,有疑问的可以问我  ;另外数据量比较大  每次需要考虑的节点有几百个   至于连接的边就更多了 谢谢
关键词:comp IBM 中石化 COM ATT

沙发
l1i2n3i4n5g 在职认证  发表于 2018-1-28 14:05:03
  1. /*建立原始数据集test*/
  2. data test;
  3. input (compa compb) (:$20.);
  4. cards;
  5. 脸书        中石化
  6. 苹果        中石化
  7. ibm        苹果
  8. ibm        高盛
  9. att        德州
  10. 德州        中石油
  11. ;
  12. run;

  13. /*
  14. 在数据集test基础上,生成数据集test1,
  15. 新设2个变量a和b,把变量compa和compb的值摞在一起
  16. (变量a和b其实是一样的,compa和compb接下来不会用到了),
  17. a、b的主要目的是用于找出所有出现的节点(根据变量a或b),
  18. 以及网络划分时候找出与每个节点连接的节点
  19. (前提是compa和compb的关系没有方向)*/
  20. data test1;
  21.    length
  22.       a $20
  23.       b $20;
  24.    set test;
  25.    a=compa;
  26.    b=compb;
  27.    output;
  28.    a=compb;
  29.    b=compa;
  30.    output;
  31. run;

  32. /*数据集test1按变量a排序,这一步无关紧要*/
  33. proc sort data=test1;
  34.    by a;
  35. run;

  36. /*根据数据集test1中的变量a(或变量b),新建数据集notes,
  37. 储存所有出现的节点,具体储存在变量名note_name中*/
  38. proc sql;
  39.    create table notes as
  40.    select distinct a as note_name
  41.    from test1;
  42. run;
  43. quit;

  44. /*在数据集notes基础上,复制note_name变量,
  45. 命名为temp,temp变量用于网络划分时候归类。
  46. 另外把所有出现的节点数赋值给宏变量&n。*/

  47. data notes;
  48.    length temp $20;
  49.    set notes end=last;
  50.    temp=note_name;
  51.    if last then call symput('n',_n_);
  52. run;

  53. /*
  54. 网络划分的大概思想是在数据集notes的temp变量里选一个节点,
  55. 根据数据集test1的变量a、b,找出与这个节点连接的其他节点,
  56. 后者(与这个节点连接的其他节点)用前者(这个节点)代替
  57. (具体操作时数据集test1中的变量a和b,分别做变量值替换;
  58. 数据集notes中的变量temp,做变量值替换),
  59. 根据所有出现的节点数(&n)遍历后,
  60. 数据集notes中变量temp的值域数量,就是网络数,
  61. 而变量note_name则记录着原始节点名称。
  62. */

  63. /*根据所有出现的节点数(&n)遍历*/
  64. %macro test;
  65. %do i=1 %to &n;
  66.    /*在数据集notes的temp变量里选一个节点*/
  67.    data _null_;
  68.       set notes;
  69.       if _n_=&i then call symput('note_name',temp);
  70.    run;
  71.    /*根据数据集test1的变量a、b,找出与这个节点连接的其他节点,
  72.    存在数据集temp_one_note中*/
  73.    proc sql;
  74.       create table temp_one_note as
  75.       select distinct b from test1
  76.       where a="¬e_name";
  77.    run;
  78.    quit;
  79.    /*为了方便,把“与这个节点连接的其他节点”存入宏变量&one_note*/
  80.    proc sql noprint;
  81.       select distinct b into : one_note separated by ' '
  82.       from temp_one_note;
  83.    run;
  84.    quit;
  85.    /*数据集test1中的变量a和b,分别做变量值替换*/
  86.    data test1;
  87.       set test1;
  88.       %do j=1 %to %sysfunc(countw(&one_note));
  89.       if a=scan("&one_note",&j) then a="¬e_name";
  90.       if b=scan("&one_note",&j) then b="¬e_name";
  91.       %end;
  92.    /*数据集notes中的变量temp,做变量值替换*/
  93.    data notes;
  94.       set notes;
  95.       %do j=1 %to %sysfunc(countw(&one_note));
  96.       if temp=scan("&one_note",&j) then temp="¬e_name";
  97.       %end;
  98.    run;
  99. %end;
  100. %mend;
  101. %test

  102. /*网络内节点全排列*/
  103. proc sql;
  104.    create table want as
  105.    select t1.note_name as comp1, t2.note_name as comp2 from notes as t1, notes as t2
  106.    where t1.temp=t2.temp;
  107. run;
  108. quit;
  109. data want;
  110.    set want;
  111.    if comp1^=comp2;
  112. run;
复制代码

已有 1 人评分论坛币 收起 理由
admin_kefu + 30 热心帮助其他会员

总评分: 论坛币 + 30   查看全部评分

藤椅
xiami2000 在职认证  发表于 2018-1-29 11:56:36
可以试一试 PROC SQL。 第一步是为每一列建一个Distinct Table;第二步把两个Table合在一起建一个笛卡尔Table,让后去掉有相同值的行。
以下是Sample Code:
proc sql;
        create table compa as select distinct compa
        from have;
        create table compb as select distinct compb
        from have;
        create table want as select *
        from compa,compb
        where compa ne compb
        ;
quit;
已有 2 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
akalius + 5 + 3 + 3 + 3 精彩帖子
admin_kefu + 20 + 2 + 2 热心帮助其他会员

总评分: 论坛币 + 25  学术水平 + 5  热心指数 + 5  信用等级 + 3   查看全部评分

板凳
akalius 学生认证  发表于 2018-1-30 11:48:46
xiami2000 发表于 2018-1-29 11:56
可以试一试 PROC SQL。 第一步是为每一列建一个Distinct Table;第二步把两个Table合在一起建一个笛卡尔Tab ...
xiexie    但是你这样做的不是我想要的

报纸
akalius 学生认证  发表于 2018-1-31 22:22:14
l1i2n3i4n5g 发表于 2018-1-28 14:05
data test1;
   length a $20
          b $20;
非常感谢   能否大概讲讲思路  谢谢

地板
Strive、 发表于 2018-1-31 22:37:39
  1. data temp;
  2.         input a $ b $;
  3.         cards;
  4.         脸书        中石化
  5.         苹果        中石化
  6.         ibm        苹果
  7.         ibm        高盛
  8.         att        德州
  9.         德州        中石油
  10. run;


  11. data f1;
  12.         set temp;
  13.         length combind $200.;
  14.         retain combind '' index;
  15.         if ^ kindex(combind,a) and ^ kindex(combind,b) then do;
  16.                 combind = compress(a)||"、"||compress(b);
  17.                 index + 1;
  18.         end;
  19.         else if kindex(combind,a) and ^ kindex(combind,b) then combind = compress(combind)||"、"||compress(b);
  20.         else if ^ kindex(combind,a) and kindex(combind,b) then combind = compress(combind)||"、"||compress(a);
  21. run;

  22. data f2;
  23.         set f1;
  24.         by index;
  25.         n = count(combind,"、");
  26.         if last.index;
  27. run;

  28. data final;
  29.         set f2;
  30.         do i = 1 to n+1;
  31.                 fa = kscan(combind,i,"、");
  32.                 do j = 1 to n+1;
  33.                         if i ^= j then do;
  34.                                 fb = kscan(combind,j,"、");
  35.                                 output;
  36.                         end;
  37.                 end;
  38.         end;
  39. run;
复制代码
已有 2 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
admin_kefu + 30 热心帮助其他会员
akalius + 5 + 3 + 3 + 3 精彩帖子

总评分: 论坛币 + 35  学术水平 + 3  热心指数 + 3  信用等级 + 3   查看全部评分

7
akalius 学生认证  发表于 2018-1-31 22:49:21
Strive、 发表于 2018-1-31 22:37
谢谢    但这个得不到想要的结果
可以用这个检验一下

脸书        中石化
苹果        中石化
ibm        苹果
ibm        高盛
att        德州
德州        中石油
001       002
002      003
003      004
006      002
008     009
001     010
008   高盛

8
l1i2n3i4n5g 在职认证  发表于 2018-2-1 10:24:18
akalius 发表于 2018-1-31 22:22
非常感谢   能否大概讲讲思路  谢谢
昨天比较匆忙,现已增加注释
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
akalius + 5 + 3 + 3 + 3 精彩帖子

总评分: 论坛币 + 5  学术水平 + 3  热心指数 + 3  信用等级 + 3   查看全部评分

9
akalius 学生认证  发表于 2018-2-7 21:57:43
l1i2n3i4n5g 发表于 2018-1-28 14:05
帅哥,你重新发了之后咋运行不了了

10
l1i2n3i4n5g 在职认证  发表于 2018-2-8 09:54:22
akalius 发表于 2018-2-7 21:57
帅哥,你重新发了之后咋运行不了了
把所有"¬e_name",改成“&note_name”
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
akalius + 5 + 3 + 3 + 3 精彩帖子

总评分: 论坛币 + 5  学术水平 + 3  热心指数 + 3  信用等级 + 3   查看全部评分

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-9 06:17