请选择 进入手机版 | 继续访问电脑版
楼主: sunjiangwei
927 9

SAS编程问题求助 [推广有奖]

  • 2关注
  • 0粉丝

博士生

7%

还不是VIP/贵宾

-

威望
0
论坛币
1029 个
通用积分
1.0000
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
844 点
帖子
106
精华
0
在线时间
200 小时
注册时间
2014-4-20
最后登录
2022-1-10

sunjiangwei 发表于 2016-12-15 17:13:53 |显示全部楼层 |坛友微信交流群
相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币

图
请问各位大神,我如何根据表一和表二的内容,得出表三的内容(其实就是根据表一的时间在表二的那个时间段内,来得出每个Card_id所对应的status).谢谢
二维码

扫码加我 拉你入群

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

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

关键词:sas编程问题 SAS编程 status card CAR sas 库合并 程序

lovexialulu 发表于 2016-12-15 18:42:22 |显示全部楼层 |坛友微信交流群
表一表二 感觉merge的key变量(Card_id) 不唯一啊,除非非常理论的情况(表一 表二 都排序 很好, 一一对应),可以考虑 新建key变量
data aa;
set a;
kk=_n_;
run;
data bb;
set b;
kk=_n_;
run;
data cc;
merge aa bb(rename=(Card_id=Card_id_ status=status_));
by kk;
if st_data<=test_time<=en_data then status=status_;
run;

使用道具

DriftKingHan 发表于 2016-12-15 23:17:05 |显示全部楼层 |坛友微信交流群
我根据图片猜测的隐含条件是
1.表一和表二有相同的行数
2.表一和表二在同一行的card_id是相同的
3.时间对比是在两个表的同一行进行的
以下是基于以上的假设做的,供参考
data tbl1;
        input card_id $ test_time :yymmdd.;
datalines;
a 20111011
b 20120506
b 20120607
d 20110503
d 20120105
;
data tbl2;
        input card_id $ (start_date end_date) (:yymmdd.) status $;
datalines;
a 20110102 20110501 aa
b 20120403 20120709 aa
b 20130101 20130401 bb
d 20110401 20110506 cc
d 20120101 20120131 dd
;
data tbl (drop = start_date end_date);
        set tbl1;
        set tbl2;
        if not (start_date le test_time le end_date) then status = '.';
run;


使用道具

wwang111 发表于 2016-12-16 08:37:02 |显示全部楼层 |坛友微信交流群
data test1;
input card_id $ test_time yymmdd10.;
format test_time yymmddn8.;
cards;
a 20111011
b 20120506
b 20120607
d 20110503
d 20120105
;

data test2;
  input card_id $ start_date : yymmdd10. end_date : yymmdd10. status $;
  cards;
  a 20110102 20110501 aa
  b 20120403 20120709 aa
  b 20130101 20130401 bb
  d 20110401 20110506 cc
  d 20120101 20120131 dd
  ;

data test3;
  set test1;
  do i=1 to nobs;
  set test2(rename=(card_id=card_id1 status=status1)) nobs=nobs point=i;
   if card_id=card_id1 and start_date<=test_time<=end_date then status=status1;
  end;
  keep card_id test_time status;
run;

使用道具

wwang111 发表于 2016-12-16 08:38:02 |显示全部楼层 |坛友微信交流群
data test1;
input card_id $ test_time yymmdd10.;
format test_time yymmddn8.;
cards;
a 20111011
b 20120506
b 20120607
d 20110503
d 20120105
;

data test2;
  input card_id $ start_date : yymmdd10. end_date : yymmdd10. status $;
  cards;
  a 20110102 20110501 aa
  b 20120403 20120709 aa
  b 20130101 20130401 bb
  d 20110401 20110506 cc
  d 20120101 20120131 dd
  ;

data test3;
  set test1;
  do i=1 to nobs;
  set test2(rename=(card_id=card_id1 status=status1)) nobs=nobs point=i;
   if card_id=card_id1 and start_date<=test_time<=end_date then status=status1;
  end;
  keep card_id test_time status;
run;

使用道具

wwang111 发表于 2016-12-16 08:38:43 |显示全部楼层 |坛友微信交流群

data test3;
  set test1;
  do i=1 to nobs;
  set test2(rename=(card_id=card_id1 status=status1)) nobs=nobs point=i;
   if card_id=card_id1 and start_date<=test_time<=end_date then status=status1;
  end;
  keep card_id test_time status;
run;

使用道具

sunjiangwei 发表于 2016-12-16 13:46:44 |显示全部楼层 |坛友微信交流群
lovexialulu 发表于 2016-12-15 18:42
表一表二 感觉merge的key变量(Card_id) 不唯一啊,除非非常理论的情况(表一 表二 都排序 很好, 一一对应) ...
如果是医院的数据的话,很容易出现这种Card_id 不唯一的情况,因为一个病人可以有很多条记录(比如CT, X光)

使用道具

sunjiangwei 发表于 2016-12-16 14:00:43 |显示全部楼层 |坛友微信交流群
wwang111 发表于 2016-12-16 08:38
data test3;
  set test1;
  do i=1 to nobs;
感谢大神的回答,问题已经解决~

因为大神在输入的时候,有些小错误,我这里把程序修改了一下,再贴上来,供大家学习

再次谢过大神

data test1;
input card_id$ test_time yymmdd10.;
format test_time yymmddn8.;
cards;
a 20111011
b 20120506
b 20120607
d 20110503
d 20120105
;
run;
data test2;
input card_id$ start_date : yymmdd10. end_date : yymmdd10. status $;
format start_date yymmddn8.
       end_date yymmddn8.;
cards;
  a 20110102 20110501 aa
  b 20120403 20120709 aa
  b 20130101 20130401 bb
  d 20110401 20110506 cc
  d 20120101 20120131 dd
  ;

data test3;
  set test1;
  do i=1 to nobs;
  set test2(rename=(card_id=card_id1 status=status1)) nobs=nobs point=i;
   if card_id=card_id1 and start_date<=test_time<=end_date then status=status1;
  end;
  keep card_id test_time status;
run;

使用道具

lovexialulu 发表于 2016-12-16 15:53:07 |显示全部楼层 |坛友微信交流群
sunjiangwei 发表于 2016-12-16 13:46
如果是医院的数据的话,很容易出现这种Card_id 不唯一的情况,因为一个病人可以有很多条记录(比如CT, X ...
merge 也能做 但是 有点勉强


data t1;
input card_id $ test_time yymmdd10.;
format test_time yymmddn8.;
cards;
a 20111011
b 20120506
b 20120607
d 20110503
d 20120105
;
run;
data t2;
  input card_id $ start_date : yymmdd10. end_date : yymmdd10. status $;
  cards;
  a 20110102 20110501 aa
  b 20120403 20120709 aa
  b 20130101 20130401 bb
  d 20110401 20110506 cc
  d 20120101 20120131 dd
  ;
run;
proc sort data=t1;by card_id;run;
proc sort data=t2;by card_id;run;

data t2_;
set t2;
by card_id;
retain cc;
if first.card_id then cc=1;
else cc+1;
run;

proc sort data=t2_ out=t2_1(keep=cc);by descending cc;run;


%macro jj(out);
data a&out.;
merge t2_(where=(cc=&out.)) t1;
by card_id;
if start_date<=test_time<=end_date;
run;
%mend jj;
%jj(1);
%jj(2);

data final;
set a1-a2;
run;

使用道具

peking198 发表于 2016-12-18 22:15:53 |显示全部楼层 |坛友微信交流群
sunjiangwei 发表于 2016-12-16 14:00
感谢大神的回答,问题已经解决~

因为大神在输入的时候,有些小错误,我这里把程序修改了一下,再贴上来 ...
请问:这里的start_date : yymmdd10.为什么用冒号,删掉冒号就提示错误,而前面的test_time yymmdd10.没用冒号呢?恳请指点,谢谢!

使用道具

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

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

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

GMT+8, 2024-3-28 21:52