楼主: aleiiy
1992 7

[有偿编程] 大型数据集拆分与拼接 [推广有奖]

  • 0关注
  • 0粉丝

高中生

30%

还不是VIP/贵宾

-

威望
0
论坛币
35 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
46 点
帖子
6
精华
0
在线时间
45 小时
注册时间
2005-6-22
最后登录
2017-4-23

15论坛币
想完成如下问题
将序列s按照num拆分为4列,注意每列名字要按照num改变。
如图,而且希望拆分为4列后,再用另一种算法拼接回原来的1列。
捕获.PNG

这个算法的本意是先把序列拆分,然后求协方差矩阵,最后将协方差矩阵拼接回1列来统计相关系数的分布情况。
目前我自己是写了一个宏,先把数据集拆分为4个数据集,然后在merge在一起,反之亦然。但这种拆分方法面对大量数据时效率实在太低,比如长为1000*200的一串拆分为1000个长为200的串,需要2分钟。

我想问问sas有没有更快捷的拆分拼接方法,觉得悬赏分不够的话可以再加。

另附我目前再用的自编低效程序:
%macro cross1(set1,var,num,s,e,set2);
data temp&s.;
set &set1.;
if &num.=&s.;
s&s.=&var.;
keep trddt s&s.;
run;
%do i=(&s.+1) %to &e.;
data temp&i.;
set &set1.;
if &num.=&i.;
s&i.=&var.;
keep trddt s&i.;
run;
data temp&s.;
merge temp&s. temp&i.;
by trddt;
run;
%end;
data &set2.;
set temp&s.;
drop trddt;
run;
%mend cross1;

关键词:大型数据 数据集 协方差矩阵 Cross Merge 分拆 拼接
沙发
sushe1527 发表于 2015-2-10 17:17:25 |只看作者 |坛友微信交流群
aleiiy 发表于 2015-2-11 09:18
没错,是应该再转置一次,完美地解决了本问题的前半部分。
请问从这个N串的阵列,如何再变回原来的一串的 ...
  1. data a;
  2. input num s;
  3. cards;
  4. 1        1
  5. 1        2
  6. 1        3
  7. 1        4
  8. 2        5
  9. 2        6
  10. 2        7
  11. 2        8
  12. 3        9
  13. 3        10
  14. 3        11
  15. 3        12
  16. 4        13
  17. 4        14
  18. 4        15
  19. 4        16
  20. ;
  21. run;
  22. proc transpose data=a out=b(drop=_name_) prefix=s;
  23. var s;
  24. by num;
  25. run;
  26. proc transpose data=b(drop=num) out=c(drop=_name_)prefix=s;run;

  27. /************************************************************************/
  28. proc transpose data=c out=d(drop=_name_)prefix=s;run;
  29. data d;set d;num=_n_;run;
  30. data e(rename=(ss=s));
  31. set d;
  32. array s(*) s1-s4;
  33. do I=1 to dim (s);
  34. ss=s(I);output;
  35. end;
  36. drop i s1-s4;
  37. run;
复制代码
已有 1 人评分经验 收起 理由
李会超 + 20 热心帮助其他会员

总评分: 经验 + 20   查看全部评分

使用道具

藤椅
mingfeng07 学生认证  发表于 2015-2-10 22:06:49 |只看作者 |坛友微信交流群
  1. proc transpose data=a out=b(drop=_name_) prefix=s;
  2. var s;
  3. by num;
  4. run;
复制代码
已有 1 人评分经验 收起 理由
李会超 + 20 热心帮助其他会员

总评分: 经验 + 20   查看全部评分

使用道具

板凳
sushe1527 发表于 2015-2-10 22:25:29 |只看作者 |坛友微信交流群
mingfeng07 发表于 2015-2-10 22:06
没写完哈
  1. proc transpose data=b(drop=num) out=c(drop=_name_)prefix=s;run;
复制代码

使用道具

报纸
sas9.4 发表于 2015-2-10 22:38:06 |只看作者 |坛友微信交流群
proc transpose data=a out=b (drop=_name_) prefix=s ;
var s;
by num;
run;

使用道具

地板
sushe1527 发表于 2015-2-10 22:44:44 |只看作者 |坛友微信交流群
sas9.4 发表于 2015-2-10 22:38
proc transpose data=a out=b (drop=_name_) prefix=s ;
var s;
by num;
  1. proc transpose data=b(drop=num) out=c(drop=_name_)prefix=s;run;
复制代码

使用道具

7
aleiiy 发表于 2015-2-11 09:18:23 |只看作者 |坛友微信交流群
sushe1527 发表于 2015-2-10 22:44
没错,是应该再转置一次,完美地解决了本问题的前半部分。
请问从这个N串的阵列,如何再变回原来的一串的序列?

使用道具

8
aleiiy 发表于 2015-2-11 12:20:50 |只看作者 |坛友微信交流群
sushe1527 发表于 2015-2-10 17:17
太感谢了,完美解决问题!

使用道具

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

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

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

GMT+8, 2024-4-27 04:20