楼主: akalius
1382 7

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

  • 10关注
  • 3粉丝

讲师

48%

还不是VIP/贵宾

-

威望
0
论坛币
4168 个
通用积分
9.1543
学术水平
4 点
热心指数
6 点
信用等级
6 点
经验
7832 点
帖子
261
精华
0
在线时间
605 小时
注册时间
2009-7-22
最后登录
2024-4-9

楼主
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
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-25 18:19