楼主: Hollycherry
2049 10

[原创博文] one question about updating data in SAS [推广有奖]

  • 1关注
  • 1粉丝

讲师

77%

还不是VIP/贵宾

-

威望
0
论坛币
91 个
通用积分
0.0498
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
85040 点
帖子
98
精华
0
在线时间
1072 小时
注册时间
2011-1-12
最后登录
2025-3-8

楼主
Hollycherry 发表于 2012-2-13 23:04:26 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
I have two data. Data X has variables A B C D E, data Y has variables D E F G H. Data X has more observations than data Y. It's not one-to-one match. If I need 1) use E from data Y to update the values of E from data X. 2) horizontally combine data X and Y. How to do that?  Thank you very much.
二维码

扫码加我 拉你入群

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

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

关键词:Updating question Dating Quest About question update values about Thank

回帖推荐

jinlin2009 发表于4楼  查看完整内容

你修改一下应该就可以用了,别忘了grouping最后

本帖被以下文库推荐

沙发
jxbwznedzq 发表于 2012-2-13 23:16:11
谢谢楼主分享!

藤椅
aibieli731001 发表于 2012-2-13 23:28:10
感谢分享。

板凳
jinlin2009 发表于 2012-2-14 00:03:53
  1. proc sql;
  2.   create table a as
  3.   select A, B, C, D, coalesce (b.E, a.E), F, G, H  from data1 a left join data2 b on
  4. a.yourkey=b.yourkey
复制代码
你修改一下应该就可以用了,别忘了grouping最后
已有 1 人评分经验 论坛币 收起 理由
bakoll + 3 + 3 精彩帖子

总评分: 经验 + 3  论坛币 + 3   查看全部评分

报纸
Hollycherry 发表于 2012-2-14 01:16:03
Thanks for your reply.  But 'left join' will gerenerate more observations than the original data X.

地板
jinlin2009 发表于 2012-2-14 01:54:10
Hollycherry 发表于 2012-2-14 01:16
Thanks for your reply.  But 'left join' will gerenerate more observations than the original data X.
不应该啊,正常的话obs 数应该和left join 左边的数据集obs 数相同

7
Hollycherry 发表于 2012-2-14 03:04:03
For example,
data ONE;
input YEAR        QTR  BUDGET;
cards;
2001        3         500         
2001        4         400         
2003        1         350
;
data TWO;
input YEAR        QTR        SALES ;
cards;
2001        4         300
2001         2               200
2002        1        600
run;
proc sql;
select two.*, budget
from one left join two on one.year = two.year;
quit;

The output is,
YEAR       QTR     SALES    BUDGET
--------------------------------------
2001         4       300       500
2001         4       300       400
2001         2       200       500
2001         2       200       400
   .           .           .         350


What I want is like,

YEAR        QTR  BUDGET  SALES
2001        3       500                .
2001        4      300            200
2003        1       350          .

8
jinlin2009 发表于 2012-2-14 03:37:09
你这里的qtr属于matching key么?按你output 2001Q2的sales会用来update2001Q4的数据。你的200放在这里很奇怪。 我给你一个code,用year和qtr做matchkey 你看看是不是你要的
  1. data ONE;
  2. input YEAR        QTR  BUDGET;
  3. cards;
  4. 2001        3         500         
  5. 2001        4         400         
  6. 2003        1         350
  7. ;
  8. data TWO;
  9. input YEAR        QTR        SALES ;
  10. cards;
  11. 2001        4         300
  12. 2001         2               200
  13. 2002        1        600
  14. run;

  15. data two;
  16.         set two;
  17.         budget=sales;
  18. run;
  19. proc sql;
  20. select a.year, a.qtr, coalesce(b.budget, a.budget) as budget, b.sales
  21. from one a left join two b on a.year = a.year and a.qtr = b.qtr;
  22. quit;
复制代码

9
Hollycherry 发表于 2012-2-14 04:40:45
Sorry, I think I used an inproper example.  I just wanted to say that using 'left join' may generate more obs than original one.
And it happened to my real data if I used 'left join'.
I need to know which statement in SAS is good for many to one match.

10
jinlin2009 发表于 2012-2-14 04:57:57
Hollycherry 发表于 2012-2-14 04:40
Sorry, I think I used an inproper example.  I just wanted to say that using 'left join' may generate ...
你如果用只2001match2001,一定会出现比原来更多的obs,因为你在两个数据集中都有超过不止一个的2001,这样sas会把每一个左边的2001和右边的2001配对,in this case, 就会有2×2个2001. 除非你能保证你join的表之间有一个唯一的match key,就像我在之前代码中同时使用 year 和 qtr (原始数据可能还有别的match key,必须都考虑进去)
已有 1 人评分热心指数 收起 理由
Hollycherry + 1 热心帮助其他会员

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

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

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