r*****y 发帖数: 199 | 1 今天遇到一个很简单的case,用datastep能够解决,不过感觉太麻烦了,我觉得SQL应
该能很方便的解决这个问题,而平时自己sql又不熟悉,只好上版上来找好心人问问了。
问题很简单,我有两个一摸一样的dataset,pre和post,我要对20多个variable做post
-pre,如果用datastep的话,每个dataset里面的variable都要改名加上后缀pre,post
,然后要再merge到一个大的dataset里面,然后还要计算diff,感觉操作起来非常复杂
。我想做得是用第一个post dataset 整个减掉 pre dataset 里面每个variable 对应
的值,请问要怎么操作呢? 我来编个dataset吧!假设
pre
id measure1 measure2 measure3
1 20 30 40
2 50 60 70
post
id measure1 measure2 measure3
1 15 20 10
2 20 40 45
我想得到如下的dataset
diff
id measure1 measure2 measure3
1 5 10 30
2 30 20 25
谁能指导一下,低级问题请别嘲笑,小弟有空一定好好学习一下sql。 |
h******e 发帖数: 1791 | 2 可以用proc contents + call execute做出来。 |
k*******a 发帖数: 772 | 3 sql似乎也不容易把,不过可以试试 proc transpose |
k*****u 发帖数: 1688 | 4 我给了一个笨办法。
data pre;
input id measure1 measure2 measure3;
cards;
1 20 30 40
2 50 60 70
;
data post;
input id measure1 measure2 measure3 ;
cards;
1 15 20 10
2 20 40 45
;
run;
%macro selectdif(maxindex);
%do i=1 %to &maxindex;
pre.measure&i-post.measure&i as dif&i
%if &i ne &maxindex %then ,
;
%end;
%mend;
proc sql;
select pre.id, %selectdif(maxindex=3)
from pre, post
where pre.id=post.id;
quit; |
m*****y 发帖数: 229 | 5 试试这个
data pre;
input id m1 m2 m3;
cards;
1 20 30 40
2 50 60 70
;
data post;
input id m1 m2 m3 ;
cards;
1 15 20 10
2 20 40 45
;
RUN;
proc sql;
select post.m1-pre.m1 as dif1, post.m2-pre.m2 as dif2, post.m3-pre.m3 as
dif3
from post, pre
where post.id=pre.id;
quit; |