楼主: reduce_fat
889 20

[实际应用] 重金悬赏: 求SAS大牛解决SAS数据合并问题 [推广有奖]

荣誉版主

海外论坛首席管理员

泰斗

25%

还不是VIP/贵宾

-

TA的文库  其他...

海外原创经济论文和写作技巧

威望
11
论坛币
3567509 个
通用积分
33978.7033
学术水平
6811 点
热心指数
7170 点
信用等级
6642 点
经验
1350 点
帖子
11996
精华
78
在线时间
1842 小时
注册时间
2011-6-13
最后登录
2024-4-20

一级伯乐勋章 初级热心勋章 初级学术勋章 中级热心勋章 中级学术勋章 高级学术勋章 初级信用勋章 特级学术勋章 高级热心勋章 中级信用勋章 特级热心勋章 高级信用勋章 特级信用勋章

600论坛币
重金悬赏:求SAS大牛解决SAS数据合并问题

具体请看附件。感觉不够可以再加。 SAS数据问题.xlsx (19.04 KB)

但是请详细解答。 可以把附件中的三个Table 放到自己的Excel 里取出评论上传到SAS里,并详细说明如何实现Table 4 里的结果结构。 这个数据只是样本不是真实数字,作为参考。 但是实际要解决的人数有几十万,需要用SAS运转要比Excel 更快更有效。

有超过一年没用SAS了,所以不少功能都生疏了,所以特来此版求教。 请把 SAS 编码放到回帖中并加以解释中间步骤的串联性。 经楼主检测能运转后24小时内发放悬赏奖励。

谢谢支持。  

能否提出用SAS Hash 解决的具体方案? 实际数据很大,一条生产链可能少,但要扩及整个系统,proc transpose 会运转缓慢,因为临时产生的数据很大。

最佳答案

l1i2n3i4n5g 查看完整内容

proc sort data=Mbr_Info out=test1; by Member_ID Main_Category; run; proc transpose data=test1 out=test2; var Category:; by Member_ID Main_Category; run; proc sql; create table test3 as select distinct test2.Member_ID, test2.Main_Category, sum(COL1*Weight) as Sum_Category from test2 left join Mbr_weights on test2.Main_Category=Mbr_weights.Main_Category and catego ...
关键词:数据合并 重金悬赏 EXCEL Table exce

回帖推荐

l1i2n3i4n5g 发表于2楼  查看完整内容

proc sort data=Mbr_Info out=test1; by Member_ID Main_Category; run; proc transpose data=test1 out=test2; var Category:; by Member_ID Main_Category; run; proc sql; create table test3 as select distinct test2.Member_ID, test2.Main_Category, sum(COL1*Weight) as Sum_Category from test2 left join Mbr_weights on test2.Main_Category=Mbr_weights.Main_Category and catego ...

luekemia 发表于20楼  查看完整内容

以下是实现代码。 Not pretty but work.
复制粘贴积分链接 https://bbs.pinggu.org/ext8_airdrop.php?airdropfrom^^uid=2669999
沙发
l1i2n3i4n5g 在职认证  发表于 2019-5-28 08:40:21 |只看作者 |坛友微信交流群
proc sort data=Mbr_Info out=test1;
   by Member_ID Main_Category;
run;

proc transpose data=test1 out=test2;
   var Category:;
   by Member_ID Main_Category;
run;

proc sql;
   create table test3 as
   select distinct test2.Member_ID, test2.Main_Category, sum(COL1*Weight) as Sum_Category from
   test2 left join Mbr_weights
   on test2.Main_Category=Mbr_weights.Main_Category and category=_NAME_
   group by Member_ID || test2.Main_Category
;
quit;

proc transpose data=test3 out=table4;
   id Main_Category;
   var Sum_Category;
   by Member_ID;
run;

使用道具

藤椅
reduce_fat 发表于 2019-5-28 10:46:59 |只看作者 |坛友微信交流群
l1i2n3i4n5g 发表于 2019-5-28 10:14
proc sort data=Mbr_Info out=test1;
   by Member_ID Main_Category;
run;
我明早开完会去试试,如果有其他问题,还请继续跟进回答。 谢谢。

使用道具

板凳
reduce_fat 发表于 2019-5-28 10:56:47 |只看作者 |坛友微信交流群
l1i2n3i4n5g 发表于 2019-5-28 10:14
proc sort data=Mbr_Info out=test1;
   by Member_ID Main_Category;
run;
proc sql 步骤没看明白。 COL1 是指proc transpose 后test2 里的column 1 吗? 为什么有了sum() statement 还要在前面select distinct test2.member_id? 有了aggregate function 应该就是一个member_id 只有一行数据才对吧?

请先解释上边问题我明早去试试。

使用道具

报纸
reduce_fat 发表于 2019-5-29 09:13:13 |只看作者 |坛友微信交流群
l1i2n3i4n5g 发表于 2019-5-28 10:14
proc sort data=Mbr_Info out=test1;
   by Member_ID Main_Category;
run;
这个proc transpose data=test1 out=test2 里的var 应该是Table_1 里的Category 1-5 分别列出来而不是Table_2里的总结Category,虽然这里不会影响什么但是如果Table_1 是几十列数据十几万行,那transpose 完了,会产生十几倍甚至几十倍的临时数据。 还有更有效省时间的方法吗? 我修改了一下你的code 跑了一下可以运转但是一两个小时才跑完。 因为数据有可能有别的问题,所以得多跑几次查错或检验个别outlier 这程序跑起来还是有点慢,不过还是谢谢啦。

使用道具

地板
reduce_fat 发表于 2019-5-29 12:02:43 |只看作者 |坛友微信交流群
l1i2n3i4n5g 发表于 2019-5-28 10:14
proc sort data=Mbr_Info out=test1;
   by Member_ID Main_Category;
run;
这个问题可以用SAS Hash 解决吗? 我记得Hash 对于大数据库很有效。

使用道具

7
l1i2n3i4n5g 在职认证  发表于 2019-5-29 13:01:50 |只看作者 |坛友微信交流群
reduce_fat 发表于 2019-5-29 12:02
这个问题可以用SAS Hash 解决吗? 我记得Hash 对于大数据库很有效。
处理速度应该还可以啊,是否加了很多其他操作?

使用道具

8
reduce_fat 发表于 2019-5-30 05:20:46 |只看作者 |坛友微信交流群
l1i2n3i4n5g 发表于 2019-5-29 13:01
处理速度应该还可以啊,是否加了很多其他操作?
数据很多,十几万人。 这个做完proc transpose 后产生的临时结果有几千万,因为原始数据里就有几十个变量。 能否用Hash 做一个? 我忘了怎么做Hash 了。

使用道具

9
reduce_fat 发表于 2019-5-30 12:11:14 |只看作者 |坛友微信交流群
寻求大牛帮助实现SAS Hash 转换数据。 这个通过proc transpose 可以做一条小的生产链的。但如果扩及整个系统,我的单机SAS 没有云处理服务器,就做不动了。 公司小买不了很多SAS都是每个人单机。 十几个数据处理的人里才有一人能有SAS使用权的。

谢谢啦。
复制粘贴积分链接 https://bbs.pinggu.org/ext8_airdrop.php?airdropfrom^^uid=2669999

使用道具

10
l1i2n3i4n5g 在职认证  发表于 2019-5-30 16:02:57 |只看作者 |坛友微信交流群
  1. proc sort data=Mbr_info;
  2.    by Member_ID Main_Category;
  3. run;

  4. data _null_1;
  5.    if _n_=0 then do;
  6.       set Mbr_weights;
  7.    end;
  8.    else if _n_=1 then do;
  9.    declare hash newly(dataset:'Mbr_weights');
  10.       newly.definekey('category', 'main_category');
  11.       newly.definedata('weight');
  12.       newly.definedone();
  13.    end;
  14.    call missing(of _all_);
  15.    set mbr_info;
  16.    by Member_ID Main_Category;
  17.    rc=newly.find(key:'Category1',key:main_category);
  18.       if rc=0 then category1=category1*weight;
  19.       else category1=0;
  20.       rc=newly.find(key:'Category2',key:main_category);
  21.       if rc=0 then category2=category2*weight;
  22.       else category2=0;
  23.       rc=newly.find(key:'Category3',key:main_category);
  24.       if rc=0 then category3=category3*weight;
  25.       else category3=0;
  26.       rc=newly.find(key:'Category4',key:main_category);
  27.       if rc=0 then category4=category4*weight;
  28.       else category4=0;
  29.       rc=newly.find(key:'Category5',key:main_category);
  30.       if rc=0 then category5=category5*weight;
  31.       else category5=0;
  32.    sum_category=sum(of category:);
  33.    retain a b c d 0;
  34.    if main_category='a' then a=sum_category;
  35.    else if main_category='b' then b=sum_category;
  36.    else if main_category='c' then c=sum_category;
  37.    else if main_category='d' then do;d=sum_category;output;end;
  38.    keep member_id a b c d;
  39. run;
复制代码


使用道具

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

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

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

GMT+8, 2024-4-25 23:16