楼主: Rock2000
1409 9

配对记录选取 [推广有奖]

  • 1关注
  • 24粉丝

已卖:6892份资源

学术权威

23%

还不是VIP/贵宾

-

威望
1
论坛币
104790 个
通用积分
51.9656
学术水平
55 点
热心指数
74 点
信用等级
48 点
经验
23510 点
帖子
520
精华
0
在线时间
10924 小时
注册时间
2004-5-27
最后登录
2025-11-12

楼主
Rock2000 发表于 2013-11-20 10:06:22 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
一配对研究,其中配对号ID中以“A”、“B”区分试验组及对照组,后3位为配对号,现想把变量GROUP=1的配对记录挑出来组成新数据集,怎么实现?

原始数据
  1. data a;
  2. input id group;
  3. cards;
  4. 1A001 1
  5. 1B001 .
  6. 1A002 1
  7. 1B002 .
  8. 1A003 .
  9. 1B003 .
  10. 1A004 1
  11. 1B004 .
  12. 1A005 1
  13. 1B005 .
  14. 1A006 .
  15. 1B006 .
  16. 2A001 1
  17. 2B001 .
  18. 2A002 1
  19. 2B002 .
  20. 2A003 .
  21. 2B003 .
  22. 2A004 1
  23. 2B004 .
  24. 2A005 1
  25. 2B005 .
  26. 2A006 .
  27. 2B006 .
  28. ;
  29. run;
复制代码

筛选后数据集

  1. ID  GROUP
  2. 1A001 1
  3. 1B001 .
  4. 1A002 1
  5. 1B002 .
  6. 1A004 1
  7. 1B004 .
  8. 1A005 1
  9. 1B005 .
  10. 2A001 1
  11. 2B001 .
  12. 2A002 1
  13. 2B002 .
  14. 2A004 1
  15. 2B004 .
  16. 2A005 1
  17. 2B005 .
复制代码


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Group cards Input Data 原始数据 记录

沙发
ziyenano 发表于 2013-11-20 10:50:07
data a;
input id $ group;
tmp=compress(id,'','kd');
cards;
1A001 1
1B001 .
1A002 1
1B002 .
1A003 .
1B003 .
1A004 1
1B004 .
1A005 1
1B005 .
1A006 .
1B006 .
2A001 1
2B001 .
2A002 1
2B002 .
2A003 .
2B003 .
2A004 1
2B004 .
2A005 1
2B005 .
2A006 .
2B006 .
;
run;


data res;
set a;
retain s;
by tmp notsorted;
if first.tmp then s=0;
s+group;
if s>0 then output;
drop tmp s;
run;
已有 1 人评分热心指数 收起 理由
Rock2000 + 5 热心帮助其他会员

总评分: 热心指数 + 5   查看全部评分

藤椅
yongyitian 发表于 2013-11-20 10:53:12
  1. data a;
  2. input id $5. group;
  3. cards;
  4. 1A001 1
  5. 1B001 .
  6. 1A002 1
  7. 1B002 .
  8. 1A003 .
  9. 1B003 .
  10. 1A004 1
  11. 1B004 .
  12. 1A005 1
  13. 1B005 .
  14. 1A006 .
  15. 1B006 .
  16. 2A001 1
  17. 2B001 .
  18. 2A002 1
  19. 2B002 .
  20. 2A003 .
  21. 2B003 .
  22. 2A004 1
  23. 2B004 .
  24. 2A005 1
  25. 2B005 .
  26. 2A006 .
  27. 2B006 .
  28. ;
  29. run;

  30. data b;
  31.      set a(rename=(id=id1 group=group1) where=(group1=1));
  32.         n = _n_;
  33.         do p = n to nobs;
  34.           set a nobs=nobs point = p;
  35.           if compress(id1,"AB") = compress(id, "AB") then output;
  36.         end;
  37.    drop id1 group1 n;
  38. run;
复制代码
已有 1 人评分学术水平 热心指数 收起 理由
Rock2000 + 1 + 5 热心帮助其他会员

总评分: 学术水平 + 1  热心指数 + 5   查看全部评分

板凳
Rock2000 发表于 2013-11-20 16:38:50
ziyenano 发表于 2013-11-20 10:50
data a;
input id $ group;
tmp=compress(id,'','kd');
单纯例子数据可以实现,但是,如果group是字符型或多值的话,本过程无能为力,谢谢回复。

报纸
Rock2000 发表于 2013-11-20 16:41:48
yongyitian 发表于 2013-11-20 10:53
不错,在group值不同及ID的区分组别不同时均可以实现。不过效率稍低,实际运行时间长些。

地板
ziyenano 发表于 2013-11-20 16:53:46
Rock2000 发表于 2013-11-20 16:38
单纯例子数据可以实现,但是,如果group是字符型或多值的话,本过程无能为力,谢谢回复。
你稍微修改一下不就好了

7
Rock2000 发表于 2013-11-20 17:02:06
其实,有更笨的方法,先建立一个真正的配对号IID,再通过中间过程可以找到匹配记录,因为中间过程过多,在实际情况下,如果数据集很大,占用临时就比较大,但是因为是数据步过程,效率似比#4楼还高些。

程序如下

  1. data a;
  2. input id$ group;
  3. cards;
  4. 1A001 1
  5. 1B001 .
  6. 1A002 1
  7. 1B002 .
  8. 1A003 .
  9. 1B003 .
  10. 1A004 1
  11. 1B004 .
  12. 1A005 1
  13. 1B005 .
  14. 1A006 .
  15. 1B006 .
  16. 2A001 1
  17. 2B001 .
  18. 2A002 1
  19. 2B002 .
  20. 2A003 .
  21. 2B003 .
  22. 2A004 1
  23. 2B004 .
  24. 2A005 1
  25. 2B005 .
  26. 2A006 .
  27. 2B006 .
  28. ;
  29. run;


  30. data a1; set a;
  31. if group=1;
  32. iid=SUBSTR(ID,1,1)||SUBSTR(ID,3,3);
  33. run;

  34. data b1; set a;
  35. if SUBSTR(ID,2,1)="B";
  36. iid=SUBSTR(ID,1,1)||SUBSTR(ID,3,3);
  37. drop group;
  38. run;

  39. proc sort data=a1; by iid; run;
  40. proc sort data=b1; by iid; run;

  41. data b2;
  42. merge a1 b1;
  43. by iid;
  44. if group=. then delete;
  45. run;

  46. data c; set a1 b2; run;
复制代码


8
Rock2000 发表于 2013-11-20 17:03:30
ziyenano 发表于 2013-11-20 16:53
你稍微修改一下不就好了
对的。

9
yongyitian 发表于 2013-11-20 22:46:40
Rock2000 发表于 2013-11-20 16:41
不错,在group值不同及ID的区分组别不同时均可以实现。不过效率稍低,实际运行时间长些。
效率稍低是因为多次读入数据. 

看看这样效率如何, 只是要多加一个变量.
data a1;
    set a;
    ID_temp = compress(ID, 'AB');
run;

proc sort data=a1;
   by ID_temp ID;
run;

data b1;
    merge a1(where=(group=1) in=ina) a1(in=inb);
    by ID_temp;
    if ina;
run;
已有 1 人评分学术水平 热心指数 收起 理由
Rock2000 + 5 + 5 热心帮助其他会员

总评分: 学术水平 + 5  热心指数 + 5   查看全部评分

10
Rock2000 发表于 2013-11-21 15:25:52
yongyitian 发表于 2013-11-20 22:46
效率稍低是因为多次读入数据. 

看看这样效率如何, 只是要多加一个变量.
对,这个高效多了,不用对每一条记录判断。

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-4 13:45