楼主: 一线天56
1895 6

有个关于如何更改数据集的小问题 [推广有奖]

  • 3关注
  • 2粉丝

已卖:297份资源

硕士生

44%

还不是VIP/贵宾

-

威望
0
论坛币
1228 个
通用积分
1.1800
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
4465 点
帖子
112
精华
0
在线时间
148 小时
注册时间
2014-11-16
最后登录
2023-7-5

楼主
一线天56 发表于 2016-10-1 21:01:55 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
有两个数据集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;
请问该怎么做?或者有没其他方法?谢谢了!

二维码

扫码加我 拉你入群

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

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

关键词:数据集 小问题 Transaction duplicates statement 如何

沙发
baiyaoqian 发表于 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;

这样可以吗?

藤椅
一线天56 发表于 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;

板凳
prince315 在职认证  发表于 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来实现,静待各路大神指导。

报纸
baiyaoqian 发表于 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;

地板
一线天56 发表于 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)也能用。

7
一线天56 发表于 2016-10-25 18:41:35
baiyaoqian 发表于 2016-10-25 17:18
优先取m的值呢
proc sql;
        create table new as
恩 第二种合并的方法挺好的。
如果在改变数据集可以再加一句: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
4 15
;
run;
data new;
        merge m(in=i1) t(in=i2 rename=(b=b2));
        by a;
                if i1=1;
        if i1=1 and i2=1 then b=b2;
                else if i1=1 and i2=0 then b=b;
        drop b2;
run;

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-27 07:51