SAS-一条群消息引发的思考

2019-10-21 16:47:53 浏览数 (1)

请看问题

看上图,某群友提出将table1的结构转换成table2的结构,这个是一个很明显的转置的操作,也并不特别明显,但是还是很明显的。

常规的解决问题方法,用transpose可以进行操作,其实并不需要merge,另外一位群友提出的在sql中利用select union all的方法,小编也尝试了一下,始终没有反推出该法如何实现,最后看到一次查2列的补充,小编顿时觉得改法有点繁琐,虽说繁琐,我们还是需要本着”黑猫白猫抓住老鼠就是好猫”的态度看问题。接下来看一下他们都是如何实现的。

1 transpose的方法

代码语言:javascript复制
data have;

input a_t1 b_t1  a_t2 b_t2 a_t3  b_t3 a_t4 b_t4;
cards;
1 2 3 4 5 67 8
;
run;
/*transpose的操作方法*/
proc transposedata=have  out=temp1;
by notsorted;   
var_all_;
run;
proc sortdata=temp1  out= temp1 ;by _NAME_;quit;
proc transposedata=temp1  out=temp2;
by _NAME_;
var COL:;
run;
data temp3;
set temp2;
Item=scan(_NAME_,2,'_');
_NAME_=scan(_NAME_,1,'_');    
run;
proc sortdata=temp3  out=temp3  ;by   Item ;quit;
proc transposedata=temp3  out=temp4(drop=_NAME_);
by Item;
var COL1;
run;

请看结果

proc transpose的用法,其实可以看小编历史推送,对proc transpose有一个基本的介绍,其实也可以通过这个栗子在来熟悉一下proc transpose,小编觉得任何一个语法刚开始用的时候可能不太熟念,不太好理解,但是多使用几次,都写几个需求,就好理解,很早的时候小编转置都是用array数组去转置,后来就觉得学了这久的程序连proc transpose都不会,就太不对起自己花在SAS上的时间了,就尝试使用proc transpose 确实方便很多,很好用。

2 Sql union all

代码语言:javascript复制
/*Sql Unionall*/
proc sql noprint;
create tableTemp5 as
select 'a'as Item ,a_t1 as t1,a_t2 as t2 ,a_t3 as t3 ,a_t4 as t4    from have
union all
select 'b'as Item ,b_t1 as t1,b_t2 as t2 ,b_t3 as t3 ,b_t4 as t4    from have;
quit;
proc transpose data=Temp5  out=Temp6;
by notsorted;   
var t1-t4;
ID Item;
run;

小编真的没有想出sql union all 如何不使用transpose可以快捷的做,小编反推程序的时候,查了一下Sql(不是proc sql 是数据库的Sql语言,其实类似),好像Sql也可以实现转置,不过看起来好烦啊,完全不如SAS便捷。在这里,我先使用sql 将数据结构稍微变动,在利用proc transpose进行转置的,看起来代码少,但是!但是如果真实需求中不止这8个变量呢,所有还是觉得前面的代码价值更高。这个其实也有亮点,就是在数据的合并的上。多一种方法就多一份成功的把握,还是需要博学。

就俩条回复,又怎么能称的上群英献策呢,当然不止俩条,真正大佬的回复截图就在下面。啥时候我也能达到这个水平呢,把SAS都能写出花样来,各种知识点运用的活灵活现~

大佬的回复-1

大佬的这段代码,我之前也没有见过这样的写法,俩个字“佩服”,如果非要用一句话来形容,那就是“佩服”X10....,为啥佩服呢,这位大佬这里用到的语法很多,知识也多,有数组,有正则,有filname还有inc,我算长见识了,%inc还能这样写...

大佬的回复-2

这是大佬的第二个解决方案,这里大佬又厉害了,把call execute用的很好。

小编其实准备想继续说一下大佬用的知识点的用法等等,突然发现自己对那些还是不太熟练,现在还没有准备好,以后会穿插在Macro、程序的推送中提到相关的用法。敬请期待与持续关注。

0 人点赞