全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
15739 5
2014-06-24
转置大家肯定都会的吧,不就是transpose么,对吧。
那我先来简单介绍一下transpose这个proc;打开help文档搜索transpose proc 大家会发现transpose底下主要有这么几个设置;
by, id, var ;
好的,这几个是起啥作用的呢,一个个来看;
还是举例子吧,不然凭我的智商可能说不清楚:
先看看原始数据集是什么样子的 (见图p1)
注意这么几个variable:index,group,response:group只有两个变量,response是我们感兴趣的值,index就是_n_对吧,注意index是唯一的,但是group是1,2交替出现的,所以不会有一个index的值即对应group为1,又对应group为2,等下看看转置后的结果大家就明白了;

复制代码


大家看看结果啊(见图p2)

id 说简单点就是新数据集的variable name,就是你新数据集的变量名称,所以一般会选index这种单一的变量,可以起到很好的标识作用;
by 就是分类进行转置,一般选的是group或者date(日期)这种分组的变量;
var 很简单,想转哪行就var哪行;
这样结果就出来了,就像我前面说的,index是唯一的,所以index=1的时候group=1有值,group=2就是缺失;后面也会有group=2有值,group=1为缺失的情况出现,图片可能看不到所以我解释一下,大家可以自己去试试;



好的,介绍完transpose我们可以进入正题了:

那就是大家真的要用transpose来进行转置么?答案是NO~~!!!

特别是真正在做数据的时候,很少会有人或者team会用transpose来做转置,除非是很小的数据集。当然,大家平时接触到的都可以归为很小的这一类,这也是大家经常用transpose的原因,事实上,我平时也很喜欢用,而且有时候transpose处理数据的效果非常的好,哼~~跑题了~~~

那处理传说中的大数据的时候,大家是怎么转置数据的呢? 很简单不停的用循环和数组一行行或者一列列自己转,大家应该能看出来这样肯定会比transpose要快,因为你需要一行就导入一行来做,所以效果会很好。

但是用data步和do循环来做有一个前提,就是,你要对整个数据有充分的了解,而且在商业中大部分情况是把多个变量汇总到一个变量里面,所以这一题的情况并不适用,这么看来transpose要强大很多。

我简单举个使用do循环的例子吧,但是这个数据集是有要求的,也就是每个组的数据应该是一样多的,不然循环起来就会出错,前面给的例子group=2比group=1要多,我先把它们变得一样然后用循环来做一次;

复制代码

大家可以看看结果(见图p3)
这个结果是不是比transpose的结果要好??(那是因为我们前面用了id,如果去掉会怎么样???)

但是在实际的商业分析中,大部分时候转置是要把多个变量转置成一个,而不是要把一个变量转置成多个,因为多维的数据建模起来会更加的困难,所以大家都喜欢低维数据~~

那我们再把它变回来~
复制代码


细心的同学肯定发现了,这里的set是在do外面的对么?
这就是行转列和列转行最大的区别了,因为一行转多列是逐行转的,所以我们要把set放在do里面,而多列转一行是一次导入在通过多个数组转的,所以我们可以把set 放在do外面一次性导入;(切记切记,如果转错了在数据量很大的时候可是很麻烦的一件事情哦),另外就是output的问题,一行转多列是不需要output的,而多列转一行是需要的;

我附上数据集test,大家可以自己去尝试,我自己是放在一开始的cluster目录下,大家自己放哪里就自己修改下,我就不在最前面再帮大家建个数据集了(这不是坑么?对吧。。。)




















附件列表
p3.jpg

原图尺寸 25.76 KB

p3.jpg

p2.jpg

原图尺寸 23.58 KB

p2.jpg

p1.jpg

原图尺寸 63.23 KB

p1.jpg

test.rar

大小:1.73 KB

 马上下载

数据集

本附件包括:

  • test.sas7bdat

二维码

扫码加我 拉你入群

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

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

全部回复
2014-6-25 14:12:45
通过循环转置,array数组可不可以放在循环外部呢?
二维码

扫码加我 拉你入群

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

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

2014-6-25 14:30:47
仙人来也 发表于 2014-6-25 14:12
通过循环转置,array数组可不可以放在循环外部呢?
数组在这里起到的作是暂时保存数据的作用;
为什么要循环是因为你数组保存的数据都是暂时的,变量的数据才是output出来的,所以数组肯定是在循环里面的,因为你数组的内容是在变化的;
我是这么理解的
二维码

扫码加我 拉你入群

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

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

2014-6-25 15:16:28
intheangel 发表于 2014-6-25 14:30
数组在这里起到的作是暂时保存数据的作用;
为什么要循环是因为你数组保存的数据都是暂时的,变量的数据 ...
原理不是很懂,但学习了。我用一个简单的数据集,用你的代码把array语句放在循环外面好像也能实现转置。还有你演示的不是把response一列转为两行吗,set也放在do里面?不知道我有没有理解错
二维码

扫码加我 拉你入群

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

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

2014-6-25 15:44:26
仙人来也 发表于 2014-6-25 15:16
原理不是很懂,但学习了。我用一个简单的数据集,用你的代码把array语句放在循环外面好像也能实 ...
我在文章里说过了,你如果是多列转一行是一次性导入再通过多个数组来转的,所以set放在do外面。。。
行转列则刚好相反
二维码

扫码加我 拉你入群

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

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

2014-6-26 13:39:21
您好,看到您的帖子很受益,可以把下面您的这段代码运行原理给我讲一下吗?真想搞明白,但是真心没搞明白,所以才向您请教,非常感谢啊~~~

data test;
do i=1 to 54; /*每个组有54个数据*/
set test;
array tr[1:54] tr1-tr54;
tr(i)=response;
end;
keep group tr1-tr54;
run;
二维码

扫码加我 拉你入群

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

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

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群