楼主: yu9954
1270 6

[有偿编程] 如何在某一变量相同的观测中选出符合条件的观测 [推广有奖]

  • 0关注
  • 1粉丝

大专生

73%

还不是VIP/贵宾

-

威望
0
论坛币
820 个
通用积分
2.0765
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
660 点
帖子
35
精华
0
在线时间
50 小时
注册时间
2018-11-22
最后登录
2023-10-23

20论坛币
有如下数据集

  • data a;
  • input group indexyear Pair_ID;
  • cards;
  • case 2011 0000048810
  • control 2009 0000048810
  • control 2006 0000048810
  • control 2007 0000145478
  • control 2010 0000145478
  • case 2013 0000145478
  • case 2010 0000151800
  • control 2013 0000151800
  • control 2007 0000151800
  • control 2010 0000151800
  • control 2012 0000151800
  • control 2011 0000151800
  • run;
想在所有pairID相同的几个观测值中,找出 group=control里面的index year最接近case的indexyear的值并输出,不知道该如何做?



比如pair-ID=000048810里面的case的indexyear 是2011, 它有两个control,一个是2009,一个是2006,想选出2009那条观测值并输出
类似的观测值有几十万组,每组里面有一个case和2-6个control

想得到结果如下图


多谢大神们指点留言!




Screen Shot 2020-08-18 at 5.05.01 PM.png (821.62 KB)

Screen Shot 2020-08-18 at 5.05.01 PM.png

关键词:control Contro contr Index Group
沙发
孤单的我们 发表于 2020-8-19 05:08:07 |只看作者 |坛友微信交流群
  1. data a;
  2. input group indexyear Pair_ID;
  3. cards;
  4. case 2011 0000048810
  5. control 2009 0000048810
  6. control 2006 0000048810
  7. control 2007 0000145478
  8. control 2010 0000145478
  9. case 2013 0000145478
  10. case 2010 0000151800
  11. control 2013 0000151800
  12. control 2007 0000151800
  13. control 2010 0000151800
  14. control 2012 0000151800
  15. control 2011 0000151800
  16. ;
  17. run;

  18. proc sql noprint;
  19.         create table want as
  20.         select * from
  21.         (select a.*,abs(b.indexyear-a.indexyear) as gap from a as a left join a(where=(group='case')) as b on a.pair_id eq b.pair_id);
  22. quit;

  23. proc sort data=want;
  24.         by Pair_ID group gap;
  25. run;

  26. data want;
  27.         set want;
  28.         by  Pair_ID group gap;
  29.         if first.pair_id then k=1;
  30.         else k+1;
  31.         retain k;
  32.         drop k gap;
  33.         if k<=2;
  34. run;
复制代码

使用道具

藤椅
hlg11 发表于 2020-8-19 11:47:18 |只看作者 |坛友微信交流群
/*导入数据*/
data a;
input group $ indexyear Pair_ID;
cards;
case 2011 0000048810
control 2009 0000048810
control 2006 0000048810
control 2007 0000145478
control 2010 0000145478
case 2013 0000145478
case 2010 0000151800
control 2013 0000151800
control 2007 0000151800
control 2010 0000151800
control 2012 0000151800
control 2011 0000151800
;
run;
/*把case 和 control 的数据分开,再横向连接,方便计算最接近的年份,也就是年作差的绝对值。*/
/*                数据分开*/
data a_case  a_control;
set a;
if group="case" then output a_case;
if group="control" then output a_control;
run;
/*                排序*/
proc sort data=a_case out=a_case2(rename=(indexyear=case_year));
by pair_id ;
run;
/*                排序*/
proc sort data=a_control out=a_control2(rename=(indexyear=control_year));
by pair_id descending indexyear ;
run;
/*                横向合并*/
data a_merge;
merge a_case2 a_control2;
by pair_id;
run;
/*                作差*/
data a_merge2;
   set a_merge;
        yeardif=min(abs(control_year-case_year));
        run;
/*                按pair_id yeardif分组排序,*/
proc sort data=a_merge2;
by pair_id yeardif;
run;
/*排序后,取相同pair_id的第yeardif一条,也就是最接近case年份那条*/
data a_end;
        set a_merge2;
        by pair_id yeardif;
        if first.pair_id;
        run;

思路图.png (47.4 KB)

需要: 1 个论坛币  [购买]

代码.txt

1.2 KB

需要: 5 个论坛币  [购买]

使用道具

板凳
jg.sas 发表于 2020-8-25 10:56:12 |只看作者 |坛友微信交流群
  1. data a;
  2. input group$ indexyear Pair_ID;
  3. cards;
  4. case 2011 0000048810
  5. control 2009 0000048810
  6. control 2006 0000048810
  7. control 2007 0000145478
  8. control 2010 0000145478
  9. case 2013 0000145478
  10. case 2010 0000151800
  11. control 2013 0000151800
  12. control 2007 0000151800
  13. control 2010 0000151800
  14. control 2012 0000151800
  15. control 2011 0000151800
  16. run;
  17. proc sort data=a;
  18.         by Pair_ID group indexyear;
  19. run;

  20. data b;
  21.         set a;
  22.         by Pair_ID group indexyear;
  23.         if last.group;
  24. run;
复制代码

使用道具

报纸
goodtolong 发表于 2020-9-2 14:12:16 |只看作者 |坛友微信交流群
  1. proc sort data=a;
  2.     by pair_id group;
  3. run;
  4. data a2(keep=indexyear_case indexyear pair_id diff);
  5.     merge a(rename=(indexyear=indexyear_case group=group1) where=(group1="case")) a(where=(group="control"));
  6.         by pair_id;
  7.         diff=abs(indexyear_case-indexyear);
  8. run;
  9. proc sort data=a2;
  10.     by pair_id diff;
  11. run;
  12. data a3;
  13.     set a2;
  14.         by pair_id diff;
  15.         if first.pair_id then output;
  16. run;
复制代码
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
xiaopingN + 1 + 1 + 1 精彩帖子

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

使用道具

地板
xiaopingN 发表于 2020-9-9 01:55:19 |只看作者 |坛友微信交流群
proc sql;
create table selection as
select control.*,
abs(control.indexyear-case.year) as diff,
min(calculated diff) as min
from (select *
       from A
       where group="control") control
left join (select indexyear as year,
                    Pair_ID as ID
             from A
             where group="case") case
on control.Pair_ID=case.ID
group by Pair_ID;
quit;

proc sql;
create table want as
select group,
       indexyear,
       Pair_ID
from selection
where diff=min;
quit;

使用道具

7
wind2019 发表于 2020-9-10 16:55:22 |只看作者 |坛友微信交流群

data a;
input group $ indexyear Pair_ID;
cards;
case 2011 0000048810
control 2009 0000048810
control 2006 0000048810
control 2007 0000145478
control 2010 0000145478
case 2013 0000145478
case 2010 0000151800
control 2013 0000151800
control 2007 0000151800
control 2010 0000151800
control 2012 0000151800
control 2011 0000151800
;
run;

proc sort data=a; by Pair_ID group indexyear;run;

data b;
        set a;
        by  Pair_ID group indexyear;
        if first.Pair_ID then do;
                benchyear=indexyear;               
        end;
        retain benchyear;
        dif=abs(indexyear-benchyear);               
run;

proc sort data=b(where=(group="control"))    ; by Pair_ID dif;run;
proc sort data=b nodupkey ; by Pair_ID;run;

结果:




使用道具

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

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

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

GMT+8, 2024-11-7 12:42