楼主: akalius
2818 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, 2026-10-29 02:55