楼主: 小鳄鱼a
1583 7

请帮忙看个程序 [推广有奖]

  • 6关注
  • 10粉丝

学科带头人

3%

还不是VIP/贵宾

-

威望
0
论坛币
125 个
通用积分
0.0040
学术水平
40 点
热心指数
45 点
信用等级
43 点
经验
32801 点
帖子
1185
精华
0
在线时间
1539 小时
注册时间
2009-7-16
最后登录
2018-10-5

100论坛币
谢谢啦 ,,,,,,,,,,,,,

ee2.xlsx

10.95 KB

最佳答案

teqel 查看完整内容

写了个,看看好不好用。好用的话把钱给二楼。我这没法试中文,所以拼音代替了
关键词:程序
沙发
teqel 发表于 2015-11-30 23:47:06 |只看作者 |坛友微信交流群
写了个,看看好不好用。好用的话把钱给二楼。我这没法试中文,所以拼音代替了
  1. data a;
  2. input id year qtr name $30.;
  3. cards;
  4. 1 1996 1 Zhangsan, Lisi, Wangwu   
  5. 1 1996 1 Liuliu                     
  6. 1 1996 1 Baba, Zhangsheng         
  7. 1 1996 1 Qiqi                  
  8. 1 1996 2 Zhangsan                  
  9. 1 1996 2 Lisi, Liuliu            
  10. 1 1996 2 Baba, Qiqi            
  11. 1 1996 2 Wangquan   
  12. 2 1996 1 Baba, Zhangsheng         
  13. 2 1996 1 Qiqi                  
  14. 2 1996 2 Zhangsan                  
  15. 2 1996 2 Lisi, Liuliu            
  16. ;

  17. data b;
  18. input year qtr name $10.;
  19. cards;
  20. 1996 1 Zhangsan
  21. 1996 1 Liuliu
  22. 1996 1 Baba
  23. 1996 1 Zhangsheng
  24. 1996 2 Zhangsan
  25. 1996 2 Lisi
  26. ;

  27. data a;
  28. set a;
  29. ii=_n_;
  30. num=count(name, ",")+1;
  31. run;

  32. proc sql;
  33. create table c as
  34. select         ii, id, year, qtr, name,
  35.                 case when sum(ind)=num then 1 else 0 end as var1,
  36.                 max(ind) as var2 from
  37. (
  38.         select         a.*, b.name as name1,
  39.                         case when index(a.name, strip(b.name)) then 1 else 0 end as ind
  40.         from a left join b on a.year=b.year and a.qtr=b.qtr
  41. )
  42. group by ii, id, year, qtr, name;

  43. select distinct id, year, qtr, name, var1, var2 from c
  44. order by ii;

  45. quit;

复制代码
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
Tigflanker + 5 + 4 + 3 + 2 再一看感觉也挺麻烦的

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

使用道具

藤椅
Tigflanker 发表于 2015-12-1 08:58:41 |只看作者 |坛友微信交流群
这个问题也不难,我把数据贴出来:

大表:
id        year        qtr        name                     var1        var2
1        1996        1        张三,李四,王五       0        1
1        1996        1        六六                            1        1
1        1996        1        巴巴,张生                 1        1
1        1996        1        琪琪                            0        0
1        1996        2        张三                            1        1
1        1996        2        李四,六六                  0        1
1        1996        2        巴巴,琪琪                  0        0
1        1996        2        王全                            0        0
                          3                        
                          4                        
          1997        1                        
          1997        2                        

小表:
year        qtr        name
1996        1        张三
1996        1        六六
1996        1        巴巴
1996        1        张生
1996        2        张三
1996        2        李四

需求:
var1规则是,name中的所有人在对应时期必须有,则取1,否则0。
var2规则是,name中至少其中一个人有,则取1,否则0。

使用道具

板凳
teqel 发表于 2015-12-1 10:33:03 |只看作者 |坛友微信交流群
看起来也不是很容易啊

使用道具

报纸
wodewin 发表于 2015-12-1 16:45:46 |只看作者 |坛友微信交流群
提醒注意一下,是中文还是英文状态下逗号
已有 1 人评分论坛币 学术水平 收起 理由
小鳄鱼a + 5 + 3 精彩帖子

总评分: 论坛币 + 5  学术水平 + 3   查看全部评分

使用道具

地板
Tigflanker 发表于 2015-12-1 17:03:28 |只看作者 |坛友微信交流群
  1. data want;
  2.   if 0 then set b(rename=name=name1);
  3.   if _n_ = 1 then do;
  4.     dcl hash h(dataset:'b(rename=name=name1)');
  5.         h.definekey(all:'y');
  6.         h.definedone();
  7.   end;

  8.   set a;
  9.   var1 = 0;
  10.   do i = 1 to countw(name);
  11.     name1 = cats(scan(name,i,','));
  12.         var1 + ~h.check();
  13.         var2 = max(var2,~h.check());
  14.   end;
  15.   var1 = (var1 = countw(name));

  16.   drop name1 i;
  17. run;
复制代码
借用teqel数据的另一种做法,不过大数据有内存不足可能,另外你name字段中文的话,scan改用kscan;countw也不知道会不会有问题
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
小鳄鱼a + 5 + 5 + 5 + 5 精彩帖子

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

使用道具

7
小鳄鱼a 发表于 2015-12-1 20:08:22 |只看作者 |坛友微信交流群
Tigflanker 发表于 2015-12-1 17:03
借用teqel数据的另一种做法,不过大数据有内存不足可能,另外你name字段中文的话,scan改用kscan;countw也 ...
哦    我用的是9.4呢   看你这类问题基本上用hash   炉火纯青了

使用道具

8
Tigflanker 发表于 2015-12-2 09:05:00 |只看作者 |坛友微信交流群
小鳄鱼a 发表于 2015-12-1 20:08
哦    我用的是9.4呢   看你这类问题基本上用hash   炉火纯青了
我很推荐你小小学一下hash,反正我感觉那东西逻辑容纳性很强,

data步循环,一维;数组循环,二维;hash遍历,三维

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

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

GMT+8, 2024-4-26 13:43