全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
1933 6
2016-10-01
有两个数据集m t:                                                            data m;
input a b;
cards;
1 32
1 48
2 10
;
run;
data t;
input a b;
cards;
1 16
2 20
;
run;如何更新或修改能让t对m中的所有值都更新,产生这个效果[img]file:///C:\Users\Administrator\AppData\Roaming\Tencent\Users\1554154782\QQ\WinTemp\RichOle\]~G~B0`4`5[3~3SHHQ]QBWJ.png[/img][img=0,1]file:///C:\Users\Administrator\AppData\Roaming\Tencent\Users\1554154782\QQ\WinTemp\RichOle\]~G~B0`4`5[3~3SHHQ]QBWJ.png[/img]
1 16
1 16
2 20

书中有个提示:Tip: If you want all duplicates in the master data set to be updated with the
transaction value, use a DO loop to execute a SET statement with the KEY= option
multiple times.原程序是:data m;
set t (rename=(b=newb));
modify m key=index;
b=newb;
run;
请问该怎么做?或者有没其他方法?谢谢了!

二维码

扫码加我 拉你入群

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

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

全部回复
2016-10-24 11:23:49

proc sql;
        create table new as
                select t1.a,
                                t2.b
                from m t1
                left join t t2
                on t1.a=t2.a;
quit;

proc print data=new;
run;

这样可以吗?
二维码

扫码加我 拉你入群

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

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

2016-10-25 16:06:57
baiyaoqian 发表于 2016-10-24 11:23
proc sql;
        create table new as
                select t1.a,
这种想法只能针对本道题了,比如这两个数据集就有毛病了。data m;
input a b;
cards;
1 32
1 48
2 10
3 12
;
run;
data t;
input a b;
cards;
1 16
2 20
;
run;
二维码

扫码加我 拉你入群

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

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

2016-10-25 16:52:42
想到用类似SQL环境的命令:
proc sql;
update m
set b= (select b from t where t.a=m.a)
where a in (select a from t)
;quit;

这样就保证所有的t里面能找到key值的部分都被更新了。至于data步的modify,也只知道只更新重复值的第一条,没试过怎么用那个提示的方法,do loop来实现,静待各路大神指导。
二维码

扫码加我 拉你入群

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

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

2016-10-25 17:18:42
一线天56 发表于 2016-10-25 16:06
这种想法只能针对本道题了,比如这两个数据集就有毛病了。data m;
input a b;
cards;
优先取m的值呢
proc sql;
        create table new as
                select t1.a,
                               coalesce(t2.b,t1.b)
                from m t1
                left join t t2
                on t1.a=t2.a;
quit;

proc print data=new;
run;

或者
data new;
        merge m(in=i1) t(in=i2 rename=(b=b2));
        by a;
        if i1=1 and i2=1 then b=b2;
                else if i1=1 and i2=0 then b=b;
        drop b2;
run;

二维码

扫码加我 拉你入群

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

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

2016-10-25 18:31:02
prince315 发表于 2016-10-25 16:52
想到用类似SQL环境的命令:
proc sql;
update m
写的太高明了,select字句用的真灵活。这句select b from t where t.a=m.a让我写只能写成select t.b from t,m where t.a=m.a,但这样又不对。另外不是select字句中只有输出一个值时前面才能用等号吗?竟然这样set b= (select b from t where t.a=m.a)也能用。
二维码

扫码加我 拉你入群

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

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

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

说点什么

分享

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