楼主: akalius
1766 7

[程序分享] 分成对应变量 [推广有奖]

  • 10关注
  • 3粉丝

已卖:155份资源

讲师

50%

还不是VIP/贵宾

-

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

楼主
akalius 学生认证  发表于 2017-3-30 10:10:15 |AI写论文
200论坛币
初始数据集

name
张三,李四
张三,王五
张三,李四,小七
小七,毛爸


想得到的数据集

nameanameb
张三李四
李四张三
张三王五
王五张三
张三李四
李四张三
张三小七
小七张三
李四小七
小七李四
小七毛爸
毛爸小七


谢谢    当然还在这个基础上  nodupkeys namea nameb

最佳答案

zwnSAS121 查看完整内容

data name; input string $30.; cards; 张三 李四 张三 王五 张三 李四 小七 小七 毛爸 ; data comb; set name; n=countw(string); do i= 1 to n-1; do j= i+1 to n; name1=scan(string,i); name2=scan(string,j); output; name1=scan(string,j); name2=scan(string,i); output; end; end; run;
关键词:nodupkeys NODUPKEY name 张三李四 mean

沙发
zwnSAS121 发表于 2017-3-30 10:10:16
data name;
input string  $30.;
cards;
张三 李四
张三 王五
张三 李四 小七
小七 毛爸
;
data comb;
set name;
n=countw(string);
do i= 1 to n-1;
        do j= i+1 to n;
name1=scan(string,i);
name2=scan(string,j);
        output;
name1=scan(string,j);
name2=scan(string,i);
        output;
        end;
   end;
run;

藤椅
akalius 学生认证  发表于 2017-3-30 16:01:25
zwnSAS121 发表于 2017-3-30 15:08
data name;
input string  $30.;
cards;
谢谢   但是逗号如何处理呢

板凳
lovexialulu 发表于 2017-3-30 16:05:55
  1. data a;
  2. input x $50.;
  3. datalines;
  4. wwu,lisi
  5. lisi,zhangs
  6. zhangs,lisi,xiaoqi
  7. xiaoqi,xiaoliu
  8. xiaoqi,xiaoliu,wwu,lisi,zhangs
  9. ;
  10. run;

  11. data b;
  12. set a;
  13. num=countw(x,',');
  14. length n $20.;
  15. do i=1 to num;
  16. if index(x,',') then do;
  17. n=scan(x,i,',');
  18. end;output;
  19. end;
  20. run;
  21. proc sort data=b out=bb;by x i;where n ne '';run;
  22. proc sql noprint;
  23.         select max(num) into: ov from bb;
  24.    quit;
  25. %macro jj;
  26. %do a=1 %to &ov;
  27. %do b=1 %to &ov;
  28. data cc&a&b;
  29. merge bb(where=(i=&a) rename=(n=n1))
  30.       bb(where=(i=&b) rename=(n=n2));
  31.           by x;
  32.           %end;
  33. %end;

  34. run;
  35. %mend jj;
  36. %jj;

  37. data want ;
  38. set cc:;
  39. if n1 eq '' or n2 eq '' or n1 eq n2 then delete;
  40. keep x n1 n2;
  41. proc sort;by x;
  42. run;
复制代码

报纸
soporaeternus 发表于 2017-3-30 16:28:43
变集合为关系对,这种涉及到笛卡尔积的怎么能不用SQL呐......
  1. data a;
  2.         input str:$200.;
  3.         datalines;
  4. 张三,李四
  5. 张三,王五
  6. 张三,李四,小七
  7. 小七,毛爸
  8.         ;
  9. run;

  10. data b;
  11.         set a;
  12.         n+1;
  13.         do i=1 to count(str,",")+1;
  14.                 x=kscan(str,i,",");
  15.                 output;
  16.         end;
  17.         keep n x;
  18. run;

  19. proc sql;
  20.         create table c as
  21.                 select
  22.                         MONOTONIC() as nodupkeys
  23.                         ,a.x as name1
  24.                         ,b.x as name2
  25.                 from
  26.                         b a
  27.                 inner join
  28.                         b b on a.n=b.n and a.x^=b.x
  29.         ;
  30. quit;
复制代码

地板
akalius 学生认证  发表于 2017-3-30 17:16:40
soporaeternus 发表于 2017-3-30 16:28
变集合为关系对,这种涉及到笛卡尔积的怎么能不用SQL呐......
这个啥意思啊   

7
zwnSAS121 发表于 2017-3-30 19:50:35
data name;
input string  $30.;
cards;
张三,李四
张三,王五
张三,李四,小七
小七,毛爸
;
data comb;
set name;
n=countw(string);
do i= 1 to n-1;
        do j= i+1 to n;
name1=scan(string,i,',');
name2=scan(string,j,',');
        output;
name1=scan(string,j,',');
name2=scan(string,i,',');
        output;
        end;
   end;
run;

8
soporaeternus 发表于 2017-3-31 09:02:13
akalius 发表于 2017-3-30 17:16
这个啥意思啊
要给出集合里所有的两两关系对,本质就是求自乘的笛卡尔积,sql应该是最显然的方法

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

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