楼主: intheangel
14997 5

[原创博文] SAS数据挖掘小技巧——转置 [推广有奖]

  • 3关注
  • 89粉丝

VIP

副教授

25%

还不是VIP/贵宾

-

威望
1
论坛币
49842 个
通用积分
6.1883
学术水平
152 点
热心指数
168 点
信用等级
122 点
经验
12931 点
帖子
480
精华
0
在线时间
475 小时
注册时间
2013-11-22
最后登录
2023-6-28

初级热心勋章

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
转置大家肯定都会的吧,不就是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目录下,大家自己放哪里就自己修改下,我就不在最前面再帮大家建个数据集了(这不是坑么?对吧。。。)




















二维码

扫码加我 拉你入群

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

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

关键词:数据挖掘 小技巧 Transpose response Variable 小技巧

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

已有 2 人评分学术水平 热心指数 信用等级 收起 理由
slimdell + 1 + 1 + 1 热心帮助其他会员
Tigflanker + 2 + 2 + 2 观点有启发

总评分: 学术水平 + 3  热心指数 + 3  信用等级 + 3   查看全部评分

我是一只瘦瘦的小猪~~~
╭︿︿︿╮
{/-◎◎-/}
( (oo) )
  ︶︶︶
沙发
仙人来也 发表于 2014-6-25 14:12:45 |只看作者 |坛友微信交流群
通过循环转置,array数组可不可以放在循环外部呢?

使用道具

藤椅
intheangel 学生认证  发表于 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里面?不知道我有没有理解错

使用道具

报纸
intheangel 学生认证  发表于 2014-6-25 15:44:26 |只看作者 |坛友微信交流群
仙人来也 发表于 2014-6-25 15:16
原理不是很懂,但学习了。我用一个简单的数据集,用你的代码把array语句放在循环外面好像也能实 ...
我在文章里说过了,你如果是多列转一行是一次性导入再通过多个数组来转的,所以set放在do外面。。。
行转列则刚好相反
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
仙人来也 + 1 + 1 + 1 精彩帖子

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

使用道具

地板
gaotao0727 发表于 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;

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-28 22:53