搜索
人大经济论坛 附件下载

附件下载

所在主题:
文件名:  test.rar
资料下载链接地址: https://bbs.pinggu.org/a-1578037.html
本附件包括:
  • test.sas7bdat
附件大小:
转置大家肯定都会的吧,不就是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,等下看看转置后的结果大家就明白了;

  1. proc sort data=cluster.test out=test;by group;run;
  2. proc transpose data=test out=test;
  3. id index;
  4. by group;
  5. var response;
  6. 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要多,我先把它们变得一样然后用循环来做一次;

  1. proc sort data=cluster.test out=test;by group;run;
  2. data test;
  3. set test;
  4. if _n_<=108;
  5. run;

  6. data test;
  7. do i=1 to 54; /*每个组有54个数据*/
  8. set test;
  9. array tr[1:54] tr1-tr54;
  10. tr(i)=response;
  11. end;
  12. keep group tr1-tr54;
  13. run;
复制代码

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

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

那我们再把它变回来~
  1. data test;
  2. set test;
  3. do i=1 to 54; /*每个组有54个数据*/
  4. array tr[1:54] tr1-tr54;
  5. response=tr(i);
  6. output;
  7. end;
  8. drop tr1-tr54 i;
  9. run;
复制代码


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

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






















    熟悉论坛请点击新手指南
下载说明
1、论坛支持迅雷和网际快车等p2p多线程软件下载,请在上面选择下载通道单击右健下载即可。
2、论坛会定期自动批量更新下载地址,所以请不要浪费时间盗链论坛资源,盗链地址会很快失效。
3、本站为非盈利性质的学术交流网站,鼓励和保护原创作品,拒绝未经版权人许可的上传行为。本站如接到版权人发出的合格侵权通知,将积极的采取必要措施;同时,本站也将在技术手段和能力范围内,履行版权保护的注意义务。
(如有侵权,欢迎举报)
二维码

扫码加我 拉你入群

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

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

GMT+8, 2026-2-8 18:44