4月 1, 2011

Posted by in 分享 | 8 条评论

SAS中dataset行列转换

之前saslist.net分享了一个SAS面经,其中提到对dataset进行行列转换有两种方法:1.proc transpose过程步;2.do循环+array statement。对于这个常见问题,姚志勇编写的《SAS编程与数据挖掘商业案例》中(P104-106)也有讲解,摘录如下:

数据集chapt6.fishdata如下

根据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编程与数据挖掘商业案例(姚志勇 编著)

  1. hssnow很有程序员天分啊!

    [回复]

    hssnow 回复:

    啊,小弟很水的,照搬了一下而已…

    [回复]

    Admin 回复:

    尽管是基本功,还是需要练习才能掌握的。

    这可都是实战中经常用到的。

    [回复]

    Admin 回复:

    还是挺厉害的,第二种方法是我知道第一种方法后几年时间才知道的。

    [回复]

  2. 有空试试能不能用hash办到 。

    [回复]

    hssnow 回复:

    恩,hash这块俺一直都没咋好好整过,一定找时间试试

    [回复]

  3. 看看这个, http://saslist.net/archives/255 , 不需要两步。

    [回复]

    hssnow 回复:

    saslist我这边最近一直打不开啊。。。

    [回复]

Trackbacks/Pingbacks

  1. 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/ 中的问题。 [...]

发表评论

返回顶部