楼主: 小鳄鱼a
2497 12

请教个分组程序 [推广有奖]

  • 6关注
  • 10粉丝

已卖:280份资源

学科带头人

3%

还不是VIP/贵宾

-

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

楼主
小鳄鱼a 发表于 2016-11-4 22:42:47 |AI写论文
200论坛币
有数据
idaidb
ab
ac
ad
bc
df
jf
gh




idm
a
b
c
d
e
f



规则是   如果ida idb 都在idm中存在 ,在第一个表生成新变量 groupa=1  否则为0
如果ida idb 至少一个在idm中存在 ,groupb=1  否则为0

注:因为每一列都很长,所以不能采用一个个列举的方法

最佳答案

the_fly_winds 查看完整内容

楼主,我在网上找了好久的资料终于找到了实现你目的的程序. 程序有点长, 但是都是很简单的. 没有复杂的循环, 也没有宏, 是纯粹的能看懂的程序 程序分了三个表做,因为这是我目前能找到的最好最简单最直接的方法了. 希望能满足楼主要求, 也希望能对楼主有启发改进这个算法. 最后, 真的找了好久的呢, 楼主满意的话采纳我吧. MUA!
关键词:Group ABCD IDMA Dai ADB 程序

回帖推荐

木子星 发表于11楼  查看完整内容

尝试用data步写了一下,有空可以用宏写一下,思路就是利用merge来实现观测来源标识,最后通过标识按照楼主要求组合完成。

沙发
the_fly_winds 发表于 2016-11-4 22:42:48
楼主,我在网上找了好久的资料终于找到了实现你目的的程序.
程序有点长, 但是都是很简单的. 没有复杂的循环, 也没有宏, 是纯粹的能看懂的程序
程序分了三个表做,因为这是我目前能找到的最好最简单最直接的方法了.
希望能满足楼主要求, 也希望能对楼主有启发改进这个算法.  
最后,  真的找了好久的呢, 楼主满意的话采纳我吧. MUA!

  1. data a;
  2. input ida $ ;
  3. cards;
  4. a
  5. a
  6. a
  7. b
  8. d
  9. j
  10. g
  11. run;

  12. data b;
  13. input idb $;
  14. cards;
  15. b
  16. c
  17. d
  18. c
  19. f
  20. f
  21. h
  22. run;

  23. data c;
  24. input idc $;
  25. cards;
  26. a
  27. b
  28. c
  29. d
  30. e
  31. f
  32. run;

  33. proc sql;
  34. create table na as
  35. select a.*,
  36. case when c.idc is not null
  37. then 1 else 0
  38. end
  39. from a as a left join c as c
  40. on a.ida=c.idc ;
  41. quit;

  42. data na;set na;
  43. rename _tema001=ga;run;

  44. proc sql;
  45. create table nb as
  46. select b.*,
  47. case when c.idc is not null
  48. then 1 else 0
  49. end
  50. from b as b left join c as c
  51. on b.idb=c.idc ;
  52. quit;
  53. data nb;set nb;rename _tema001=gb;run;

  54. data aandb;
  55. merge a b c na nb;
  56. run;

  57. data both;
  58. set aandb;
  59. if ga=1 and gb=1 then groupa=1;
  60. else groupa=0;
  61. if ga=1 or gb=1 then groupb=1;
  62. else groupb=0;
  63. drop ga gb;
  64. run;
复制代码
已有 1 人评分论坛币 热心指数 收起 理由
admin_kefu + 30 + 5 热心帮助其他会员

总评分: 论坛币 + 30  热心指数 + 5   查看全部评分

藤椅
夏目贵志 发表于 2016-11-5 00:31:44
第二个表看不见

板凳
the_fly_winds 发表于 2016-11-5 00:35:45
请问楼主这是用什么语言编程呢?sas,excel的行吗?

报纸
黃河泉 在职认证  发表于 2016-11-5 07:37:42
请试试
  1. clear
  2. input str4 ida str4 idb
  3. a        b
  4. a        c
  5. a        d
  6. b        c
  7. d        f
  8. j        f
  9. g        h
  10. end

  11. gen da = inlist(ida,"a","b","c","d","e","f")
  12. gen db = inlist(idb,"a","b","c","d","e","f")
  13. gen groupa = da*db
  14. gen groupb = da+db
  15. replace groupb = 0 if groupb == 2
复制代码
已有 2 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
admin_kefu + 20 热心帮助其他会员
小鳄鱼a + 5 + 5 + 5 + 5 精彩帖子

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

地板
小鳄鱼a 发表于 2016-11-5 09:21:34
黃河泉 发表于 2016-11-5 07:37
请试试
不好意思   每一列都很长   不能采用这种方法   

7
小鳄鱼a 发表于 2016-11-5 09:22:35
the_fly_winds 发表于 2016-11-5 00:35
请问楼主这是用什么语言编程呢?sas,excel的行吗?
发错地方了   不好意思   用sas

8
the_fly_winds 发表于 2016-11-5 11:48:21
楼主, 我的程序虽然长, 但是处理几百万数据都没有问题的. 只需要把所有的要查找的表单独读取到数据集即可. 楼主也可以尝试用宏循环改进算法.

9
teqel 发表于 2016-11-5 12:10:14
data1 and data2:

proc sort data=data2 nodup;
by idm;

proc sql;
select a.*,
not(missing(b.idm)) and not(missing(c.idm)) as groupa,
not(missing(b.idm)) or   not(missing(c.idm)) as groupb
from data1 as a left join data2 as b on a.ida=b.idm
left join data2 as c on a.idb=c.idm;
quit;
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
小鳄鱼a + 5 + 5 + 5 + 5 精彩帖子

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

10
wang1839 在职认证  发表于 2016-11-5 14:52:12
  1. data idm;
  2. input idm $;
  3. cards;
  4. a
  5. b
  6. c
  7. d
  8. e
  9. f
  10. f
  11. ;
  12. run;


  13. proc sql noprint;
  14. select  unique idm into:var separated by " " from idm;
  15. quit;

  16. %put &var;
  17. data ori;
  18. input ida $ idb $;
  19. cards;
  20. a b
  21. a c
  22. a d
  23. b c
  24. d f
  25. j f
  26. g h
  27. ;
  28. run;

  29. data final;
  30. set ori;
  31. if index("&var",strip(ida)) & index("&var",strip(idb)) then groupa=1;else groupa=0;
  32. if index("&var",strip(ida)) | index("&var",strip(idb)) then groupb=1;else groupb=0;
  33. run;
复制代码
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
小鳄鱼a + 5 + 5 + 5 + 5 精彩帖子

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

A man who is frustrated will never stand up.

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

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