全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
1503 6
2020-08-19
悬赏 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

想得到结果如下图


多谢大神们指点留言!




二维码

扫码加我 拉你入群

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

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

全部回复
2020-8-19 05:08:07
复制代码
二维码

扫码加我 拉你入群

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

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

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 个论坛币  马上下载

二维码

扫码加我 拉你入群

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

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

2020-8-25 10:56:12
复制代码
二维码

扫码加我 拉你入群

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

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

2020-9-2 14:12:16
复制代码
二维码

扫码加我 拉你入群

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

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

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;
二维码

扫码加我 拉你入群

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

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

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群