那我先来简单介绍一下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,等下看看转置后的结果大家就明白了;
- proc sort data=cluster.test out=test;by group;run;
- proc transpose data=test out=test;
- id index;
- by group;
- var response;
- run;
大家看看结果啊(见图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要多,我先把它们变得一样然后用循环来做一次;
- proc sort data=cluster.test out=test;by group;run;
- data test;
- set test;
- if _n_<=108;
- run;
- 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;
大家可以看看结果(见图p3)
这个结果是不是比transpose的结果要好??(那是因为我们前面用了id,如果去掉会怎么样???)
但是在实际的商业分析中,大部分时候转置是要把多个变量转置成一个,而不是要把一个变量转置成多个,因为多维的数据建模起来会更加的困难,所以大家都喜欢低维数据~~
那我们再把它变回来~
- data test;
- set test;
- do i=1 to 54; /*每个组有54个数据*/
- array tr[1:54] tr1-tr54;
- response=tr(i);
- output;
- end;
- drop tr1-tr54 i;
- run;
细心的同学肯定发现了,这里的set是在do外面的对么?
这就是行转列和列转行最大的区别了,因为一行转多列是逐行转的,所以我们要把set放在do里面,而多列转一行是一次导入在通过多个数组转的,所以我们可以把set 放在do外面一次性导入;(切记切记,如果转错了在数据量很大的时候可是很麻烦的一件事情哦),另外就是output的问题,一行转多列是不需要output的,而多列转一行是需要的;
我附上数据集test,大家可以自己去尝试,我自己是放在一开始的cluster目录下,大家自己放哪里就自己修改下,我就不在最前面再帮大家建个数据集了(这不是坑么?对吧。。。)