楼主: jjltcfa
8149 12

[问答] 合并表 更新数据 [推广有奖]

  • 6关注
  • 1粉丝

本科生

16%

还不是VIP/贵宾

-

TA的文库  其他...

sAs of K

威望
0
论坛币
664 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
809 点
帖子
70
精华
0
在线时间
73 小时
注册时间
2011-12-1
最后登录
2017-9-27

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币

合并表 更新数据时遇到了困难,希望能获得大家的帮助。谢谢大家。


问题大致情况如下:

B数据集ID变量值包含A数据集ID变量值,希望将两数据集合并,合并后保留两表所有观测。当A数据集ID值 = B数据集ID值时,A数据集相应ID观测的s_date  变量值将被B数据集相应ID 观测s_date变量的值覆盖,同时在A数据集中创建e_date变量,值为相应B数据集ID观测e_date值。

数据集 A

id       ti    s_date   

aaaa     4    2011/8/24                                

aaaa      3   2011/9/22               

aaaa     1   2012/2/21

ffff     4   2011/11/10

ffff     4   2011/12/8                  


数据集 B

变量 id  ti    s_date      e_date

aaaa   7   2011/10/23     2012/4/20

cccc    7   2011/9/3      2012/3/1

eeee   7   2011/9/3       2012/3/1

ffff    7   2012/1/7      2012/7/5

gggg   7   2011/9/3       2012/3/1

hhhh   7   2011/9/3       2012/3/1


合并后的理想效果为

变量 id  ti    s_date      e_date

aaaa      7   2011/10/23   2012/4/20

aaaa      4   2011/10/23   2012/4/20                                    

aaaa      3   2011/10/23   2012/4/20               

aaaa       1   2011/10/23   2012/4/20

cccc      7   2011/9/3    2012/3/1

eeee      7   2011/9/3     2012/3/1

ffff      7   2012/1/7    2012/7/5

ffff      4   2012/1/7    2012/7/5

ffff      4   2012/1/7    2012/7/5  

gggg      7   2011/9/3     2012/3/1

hhhh      7   2011/9/3     2012/3/1



二维码

扫码加我 拉你入群

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

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

关键词:date 数据集 ATE 变量值 Tea SAS

沙发
jjltcfa 发表于 2013-7-14 19:36:19 |只看作者 |坛友微信交流群
在线等。谢谢大家。

使用道具

藤椅
yongyitian 发表于 2013-7-14 22:42:18 |只看作者 |坛友微信交流群
下面的 code 可以得到上面的结果。 估计实际情况可能要复杂些。
  1. data a;
  2. input id $ ti s_date yymmdd10.;
  3. format s_date yymmdd10.;
  4. datalines;
  5. aaaa 4 2011/8/24
  6. aaaa 3 2011/9/22
  7. aaaa 1 2012/2/21
  8. ffff 4 2011/11/10
  9. ffff 4 2011/12/8
  10. ; run;

  11. data b;
  12. input id $ ti s_date yymmdd10. e_date yymmdd10.;
  13. format s_date e_date yymmdd10.;
  14. datalines;
  15. aaaa 7 2011/10/23 2012/4/20
  16. cccc 7 2011/9/3   2012/3/1
  17. eeee 7 2011/9/3   2012/3/1
  18. ffff 7 2012/1/7   2012/7/5
  19. gggg 7 2011/9/3   2012/3/1
  20. hhhh 7 2011/9/3   2012/3/1
  21. ; run;

  22. proc sql;
  23.    create table ab as
  24.    select coalesce(a.id, b.id) as id,
  25.           coalesce(a.ti, b.ti) as ti, b.s_date, b.e_date
  26.    from a full join b
  27.    on a.id = b.id and a.ti=b.ti
  28.    order by id, ti desc;
  29. quit;

  30. data result;
  31.     set ab;
  32.      by id;
  33.       retain temp_s temp_e;
  34.       if first.id then do;
  35.         if not missing(s_date) then temp_s = s_date;
  36.         if not missing(e_date) then temp_e = e_date;
  37.       end;
  38.       if missing(s_date) then s_date=temp_s;
  39.       if missing(e_date) then e_date=temp_e;
  40.    drop temp_s temp_e;
  41. run;
复制代码

使用道具

板凳
boe 发表于 2013-7-14 23:31:54 |只看作者 |坛友微信交流群
思路和楼上一样,效率也差不多。
  1. data c;
  2.     set a b;
  3. run;
  4. proc sort data=c out=d;by id descending e_date;run;
  5. data e;
  6.     set d;
  7.     by id;
  8.     retain start end;
  9.     if first.id then do;
  10.         start=s_date;
  11.         end=e_date;
  12.     end;
  13.     format start end yymmdd10.;
  14.     drop s_date e_date;
  15. run;
复制代码

Gorgeous girl , I love !

使用道具

报纸
jjltcfa 发表于 2013-7-14 23:51:21 |只看作者 |坛友微信交流群
yongyitian 发表于 2013-7-14 22:42
下面的 code 可以得到上面的结果。 估计实际情况可能要复杂些。
谢谢帮忙 我自己也试了下,用了下PROC SQL。辛苦了。

使用道具

地板
jjltcfa 发表于 2013-7-14 23:52:17 |只看作者 |坛友微信交流群
boe 发表于 2013-7-14 23:31
思路和楼上一样,效率也差不多。
辛苦了,你们的思路都很有借鉴性,我后来用了proc sql语句。谢谢你的帮忙。

使用道具

7
jjltcfa 发表于 2013-7-14 23:54:33 |只看作者 |坛友微信交流群
自己用了下SQL
proc sql;
create table c as
select  b.id, b.s_date, b.e_date
from A a, B b
where a.id=b.id;
quit;

使用道具

8
yongyitian 发表于 2013-7-15 00:01:42 |只看作者 |坛友微信交流群
这样可以了
  1. proc sql;
  2.    create table ab as
  3.    select coalesce(a.id, b.id) as id,
  4.           coalesce(a.ti, b.ti) as ti, b.s_date, b.e_date
  5.    from a full join b
  6.    on a.id = b.id and a.ti=b.ti
  7.    order by id, ti desc;
  8. quit;

  9. proc sql;
  10.    create table final as
  11.    select ab.id, ab.ti, b.s_date as s_date, b.e_date as e_date
  12.    from ab, b
  13.    where ab.id = b.id;
  14. quit;
复制代码

使用道具

9
jjltcfa 发表于 2013-7-15 09:25:53 |只看作者 |坛友微信交流群
yongyitian 发表于 2013-7-15 00:01
这样可以了
谢谢你的帮忙,你的代码考虑的更加细致。辛苦了。感谢。

使用道具

10
coco-123 发表于 2014-8-3 21:54:14 |只看作者 |坛友微信交流群
data an;
input id $ ti s_date yymmdd10.;
format s_date yymmdd10.;
datalines;
aaaa 4 2011/8/24
aaaa 3 2011/9/22
aaaa 1 2012/2/21
ffff 4 2011/11/10
ffff 4 2011/12/8
; run;
data bn;
input id $ ti s_date yymmdd10. e_date yymmdd10.;
format s_date e_date yymmdd10.;
datalines;
aaaa 7 2011/10/23 2012/4/20
cccc 7 2011/9/3   2012/3/1
eeee 7 2011/9/3   2012/3/1
ffff 7 2012/1/7   2012/7/5
gggg 7 2011/9/3   2012/3/1
hhhh 7 2011/9/3   2012/3/1
; run;
/*data new;
set a b;
run;
proc sort data=new;by id;run;*/
proc sort data=an;by id;run;
proc sort data=bn;by id;run;
data new;
merge an(in=a1)  bn(in=a2);
by id;
if a1=1;
run;
data final;
set new bn;
run;
proc sort data=final;by id;run;

使用道具

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

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

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

GMT+8, 2024-4-20 09:17