4月 1, 2011
Posted by hssnow in 分享 | 8 条评论
SAS中dataset行列转换
之前saslist.net分享了一个SAS面经,其中提到对dataset进行行列转换有两种方法:1.proc transpose过程步;2.do循环+array statement。对于这个常见问题,姚志勇编写的《SAS编程与数据挖掘商业案例》中(P104-106)也有讲解,摘录如下:
根据chapt6.fishdata将列转换成行:
1 2 3 4 | proc transpose data=chapt6.fishdata out=chapt6.fishlength(rename=(col1=measurement)); var length1-length4; by location date; run; |
1 2 3 4 5 6 7 8 9 | data chapt6.fishlength2; set chapt6.fishdata(keep=location date length1-length4); array tr[1:4] length1-length4; do i=1 to 4; measurement=tr(i); output; end; keep location date measurement; run; |
若再根据chapt6.fishlength将行转换成列:
1 2 3 4 5 | proc transpose data=chapt6.fishlength out=chapt6.fishdata2; var measurement; by location date; id _name_; run; |
1 2 3 4 5 6 7 8 | data chapt6.fishdata3; do i=1 to 4; set chapt6.fishlength(keep=location date measurement); array tr[1:4] length1-length4; tr(i)=measurement; end; keep location date length1-length4; run; |
小记:
- proc transpose是专门用来对数据集进行行列转换的过程步,可以通过by、var、id等语句进行控制来满足行列转换要求,不过有时可能会需要经过两此proc transpose才能达到目的。
- do循环+array statement的方法主要是利用对应数组元素来记录特定观测值,再通过输出达到行列转换的目的。
- do循环+array statement效率高于proc transpose。
参考文献
1.SAS编程与数据挖掘商业案例(姚志勇 编著)
Trackbacks/Pingbacks
- SAS转置大法列表 » SAS资源资讯列表 - [...] 不要以为很简单,看似简单技巧,其实可以秒杀一片问题。具体可以参看论坛里面的类似问题:这个问题的第一步:http://bbs.pinggu.org/thread-996735-1-1.html ,还有此问题第一步:http://bbs.pinggu.org/thread-970841-1-1.html 等等;还有hssnow的博客文章:http://hssnow.name/2011/04/dataset-transformation/ 中的问题。 [...]
hssnow很有程序员天分啊!
[回复]
hssnow 回复:
4月 2nd, 2011 at 10:37
啊,小弟很水的,照搬了一下而已…
[回复]
Admin 回复:
4月 2nd, 2011 at 12:20
尽管是基本功,还是需要练习才能掌握的。
这可都是实战中经常用到的。
[回复]
Admin 回复:
4月 2nd, 2011 at 12:26
还是挺厉害的,第二种方法是我知道第一种方法后几年时间才知道的。
[回复]
有空试试能不能用hash办到 。
[回复]
hssnow 回复:
4月 2nd, 2011 at 13:12
恩,hash这块俺一直都没咋好好整过,一定找时间试试
[回复]
看看这个, http://saslist.net/archives/255 , 不需要两步。
[回复]
hssnow 回复:
5月 17th, 2012 at 12:01
saslist我这边最近一直打不开啊。。。
[回复]