请选择 进入手机版 | 继续访问电脑版
楼主: reduce_fat
831 20

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

reduce_fat 发表于 2019-5-31 07:24:01 |显示全部楼层 |坛友微信交流群
l1i2n3i4n5g 发表于 2019-5-30 16:02
明早去试试,周末再答复。

使用道具

8112mmw 发表于 2019-5-31 18:52:11 |显示全部楼层 |坛友微信交流群
l1i2n3i4n5g 发表于 2019-5-30 16:02
还没仔细看代码,但是扫一眼就觉得很高深!

使用道具

reduce_fat 发表于 2019-6-1 09:44:02 |显示全部楼层 |坛友微信交流群
l1i2n3i4n5g 发表于 2019-5-30 16:02
这个Hash Code不知道哪里有点问题,出来的结果都是 . 或者是missing value。 是每个人的每个category 的indicator (0 或 1) 乘以 每个category 的 weight ,然后把它们加起来得出每个人的sum weights。 每个人有四个 main category 到最后会有四个main category 的sum weights。 但是这个出来的结果会把每个人的sum weights 显示四行,四个main category 应该是一人四列,最后一人一行的结果才对。 就像附件里Table 4 显示的那样。 前面那个proc transpose 就是这样显示的结果。 为什么Hash 不能直接显示?  

使用道具

l1i2n3i4n5g 在职认证  发表于 2019-6-3 14:55:38 |显示全部楼层 |坛友微信交流群
reduce_fat 发表于 2019-6-1 09:44
这个Hash Code不知道哪里有点问题,出来的结果都是 . 或者是missing value。 是每个人的每个category 的i ...
  1. data Mbr_Info;
复制代码


使用道具

reduce_fat 发表于 2019-6-4 05:39:44 |显示全部楼层 |坛友微信交流群
l1i2n3i4n5g 发表于 2019-6-3 14:55
什么意思只有一行data mbr_info? Hash code 里的哪一行错了? 怎么改? 谢谢。

使用道具

l1i2n3i4n5g 在职认证  发表于 2019-6-4 11:30:03 |显示全部楼层 |坛友微信交流群
  1. data Mbr_Info;
  2. input
  3. Member_ID :$10.
  4. Category1        Category2        Category3        Category4        Category5
  5. Main_Category :$10.;
  6. cards;
  7. 123452        0        1        0        0        1        a
  8. 123451        0        0        1        0        0        a
  9. 123453        0        1        0        0        0        a
  10. 123454        1        1        0        0        0        a
  11. 123457        0        1        0        1        0        a
  12. 123458        0        0        1        0        0        a
  13. 123459        1        0        0        1        0        a
  14. 123450        0        0        1        1        0        a
  15. 123456        1        0        0        0        1        a
  16. 123455        0        1        0        1        1        a
  17. 123452        0        1        0        0        1        b
  18. 123451        0        0        1        0        0        b
  19. 123453        0        1        0        0        0        b
  20. 123454        1        1        0        0        0        b
  21. 123457        0        1        0        1        0        b
  22. 123458        0        0        1        0        0        b
  23. 123459        1        0        0        1        0        b
  24. 123450        0        0        1        1        0        b
  25. 123456        1        0        0        0        1        b
  26. 123455        0        1        0        1        1        b
  27. 123452        0        1        0        0        1        c
  28. 123451        0        0        1        0        0        c
  29. 123453        0        1        0        0        0        c
  30. 123454        1        1        0        0        0        c
  31. 123457        0        1        0        1        0        c
  32. 123458        0        0        1        0        0        c
  33. 123459        1        0        0        1        0        c
  34. 123450        0        0        1        1        0        c
  35. 123456        1        0        0        0        1        c
  36. 123455        0        1        0        1        1        c
  37. 123452        0        1        0        0        1        d
  38. 123451        0        0        1        0        0        d
  39. 123453        0        1        0        0        0        d
  40. 123454        1        1        0        0        0        d
  41. 123457        0        1        0        1        0        d
  42. 123458        0        0        1        0        0        d
  43. 123459        1        0        0        1        0        d
  44. 123450        0        0        1        1        0        d
  45. 123456        1        0        0        0        1        d
  46. 123455        0        1        0        1        1        d
  47. ;
  48. run;

  49. data Mbr_Weights;
  50. input
  51. Category :$10.
  52. Weight
  53. Main_Category :$10.;
  54. cards;
  55. Category1        0.7        a
  56. Category2        0.9        a
  57. Category3        0.3        a
  58. Category4        0.5        a
  59. Category1        0.4        b
  60. Category2        0.7        b
  61. Category3        0.6        b
  62. Category5        0.3        b
  63. Category2        0.7        c
  64. Category3        0.3        c
  65. Category4        0.6        c
  66. Category5        0.5        c
  67. Category1        0.4        d
  68. Category3        0.9        d
  69. Category4        0.2        d
  70. Category5        0.8        d
  71. ;
  72. run;

  73. proc sort data=Mbr_info;
  74.    by Member_ID Main_Category;
  75. run;

  76. data _null_1;
  77.    if _n_=0 then do;
  78.       set Mbr_weights;
  79.    end;
  80.    else if _n_=1 then do;
  81.    declare hash newly(dataset:'Mbr_weights');
  82.       newly.definekey('category', 'main_category');
  83.       newly.definedata('weight');
  84.       newly.definedone();
  85.    end;
  86.    call missing(of _all_);
  87.    set mbr_info;
  88.    by Member_ID Main_Category;
  89.    rc=newly.find(key:'Category1',key:main_category);
  90.       if rc=0 then category1=category1*weight;
  91.       else category1=0;
  92.       rc=newly.find(key:'Category2',key:main_category);
  93.       if rc=0 then category2=category2*weight;
  94.       else category2=0;
  95.       rc=newly.find(key:'Category3',key:main_category);
  96.       if rc=0 then category3=category3*weight;
  97.       else category3=0;
  98.       rc=newly.find(key:'Category4',key:main_category);
  99.       if rc=0 then category4=category4*weight;
  100.       else category4=0;
  101.       rc=newly.find(key:'Category5',key:main_category);
  102.       if rc=0 then category5=category5*weight;
  103.       else category5=0;
  104.    sum_category=sum(of category:);
  105.    retain a b c d 0;
  106.    if main_category='a' then a=sum_category;
  107.    else if main_category='b' then b=sum_category;
  108.    else if main_category='c' then c=sum_category;
  109.    else if main_category='d' then do;d=sum_category;output;end;
  110.    keep member_id a b c d;
  111. run;

  112. proc print;run;
复制代码

使用道具

reduce_fat 发表于 2019-6-4 11:50:13 |显示全部楼层 |坛友微信交流群
l1i2n3i4n5g 发表于 2019-6-4 11:30
最后的那个Output; end; 系统显示多余。 我得删除了才能运行,不知道为何?

还有retain a b c d 0; 为什么最后多出了一个0? a, b, c, d 是category 不是数字。 不过即使把那个0 删除了跑出来的结果只显示column names 没有任何row。 前面两个input data step 不能用cards 数据又十几万行 。 我直接用proc sql load 出来然后整合在一起的。 这个没有问题,你给我的proc transpose 都能跑出结果但就是慢。 这个Hash 要快很多,但不知道data _null_1 的步骤里哪里出错了。

在做Hash 以前,两个dataset mbr_info 和mbr_weight 都已经proc sort by member ID main_category 了, 但是mbr weights 里没有member ID 所以只proc sort by main_category。 还需要做什么准备工作确保Hash 能跑出结果吗?

谢谢。

使用道具

l1i2n3i4n5g 在职认证  发表于 2019-6-4 11:58:33 |显示全部楼层 |坛友微信交流群
reduce_fat 发表于 2019-6-4 11:50
最后的那个Output; end; 系统显示多余。 我得删除了才能运行,不知道为何?

还有retain a b c d 0; ...
针对例子,直接复制16楼的代码就可以运行,你说的这些问题,我这边不存在,所以不晓得哪里出问题。

使用道具

reduce_fat 发表于 2019-6-4 14:37:31 |显示全部楼层 |坛友微信交流群
l1i2n3i4n5g 发表于 2019-6-4 11:58
针对例子,直接复制16楼的代码就可以运行,你说的这些问题,我这边不存在,所以不晓得哪里出问题。
有可能是Var Type 的事。 有可能在数据整合过程中某些Var 比如Member_ID 被从character 换成numeric 之类的。 你的code 我也没看出大问题。 我明天再试验一下。

使用道具

luekemia 发表于 2019-6-4 15:04:06 |显示全部楼层 |坛友微信交流群
以下是实现代码。
Not pretty but work.

  1. data Mbr_Info;
  2. input
  3. Member_ID $10.
  4. Category1 Category2 Category3 Category4 Category5 Main_Category $10.;
  5. cards;
  6. 123452        0        1        0        0        1        a
  7. 123451        0        0        1        0        0        a
  8. 123453        0        1        0        0        0        a
  9. 123454        1        1        0        0        0        a
  10. 123457        0        1        0        1        0        a
  11. 123458        0        0        1        0        0        a
  12. 123459        1        0        0        1        0        a
  13. 123450        0        0        1        1        0        a
  14. 123456        1        0        0        0        1        a
  15. 123455        0        1        0        1        1        a
  16. 123452        0        1        0        0        1        b
  17. 123451        0        0        1        0        0        b
  18. 123453        0        1        0        0        0        b
  19. 123454        1        1        0        0        0        b
  20. 123457        0        1        0        1        0        b
  21. 123458        0        0        1        0        0        b
  22. 123459        1        0        0        1        0        b
  23. 123450        0        0        1        1        0        b
  24. 123456        1        0        0        0        1        b
  25. 123455        0        1        0        1        1        b
  26. 123452        0        1        0        0        1        c
  27. 123451        0        0        1        0        0        c
  28. 123453        0        1        0        0        0        c
  29. 123454        1        1        0        0        0        c
  30. 123457        0        1        0        1        0        c
  31. 123458        0        0        1        0        0        c
  32. 123459        1        0        0        1        0        c
  33. 123450        0        0        1        1        0        c
  34. 123456        1        0        0        0        1        c
  35. 123455        0        1        0        1        1        c
  36. 123452        0        1        0        0        1        d
  37. 123451        0        0        1        0        0        d
  38. 123453        0        1        0        0        0        d
  39. 123454        1        1        0        0        0        d
  40. 123457        0        1        0        1        0        d
  41. 123458        0        0        1        0        0        d
  42. 123459        1        0        0        1        0        d
  43. 123450        0        0        1        1        0        d
  44. 123456        1        0        0        0        1        d
  45. 123455        0        1        0        1        1        d
  46. ;
  47. run;

  48. data Mbr_Weights;
  49. input Category $10.
  50. Weight Main_Category $10.;
  51. cards;
  52. Category1        0.7        a
  53. Category2        0.9        a
  54. Category3        0.3        a
  55. Category4        0.5        a
  56. Category1        0.4        b
  57. Category2        0.7        b
  58. Category3        0.6        b
  59. Category5        0.3        b
  60. Category2        0.7        c
  61. Category3        0.3        c
  62. Category4        0.6        c
  63. Category5        0.5        c
  64. Category1        0.4        d
  65. Category3        0.9        d
  66. Category4        0.2        d
  67. Category5        0.8        d
  68. ;
  69. run;

  70. data Mbr_Info_temp;
  71. retain rec_id;
  72. set Mbr_Info;
  73. array c(*) Category1-Category5;
  74. rec_id = _n_;
  75. do i=1 to dim(c);
  76.         if c(i)=1 then do;
  77.           Category = 'Category'||compress(i);output;
  78.         end;
  79. end;
  80. drop i;
  81. run;

  82. proc sql;
  83. create table temp2 as
  84. select a.*,Weight
  85. from Mbr_Info_temp a
  86. left join Mbr_weights b
  87. on a.Main_Category = b.Main_Category
  88. and a.Category = b.Category
  89. order by rec_id,a.Main_Category,a.Category
  90. ;quit;

  91. data Mbr_score;set temp2;
  92. by rec_id;
  93. retain Cat1-Cat5;
  94. array c Cat1-Cat5;
  95. if first.rec_id then do over c;
  96. c=0;
  97. end;
  98. if Category = 'Category1' then Cat1=Category1*weight;
  99. else if Category = 'Category2' then Cat2=Category2*weight;
  100. else if Category = 'Category3' then Cat3=Category3*weight;
  101. else if Category = 'Category4' then Cat4=Category4*weight;
  102. else if Category = 'Category5' then Cat5=Category5*weight;
  103. if last.rec_id then do;
  104. Category1=Cat1;
  105. Category2=Cat2;
  106. Category3=Cat3;
  107. Category4=Cat4;
  108. Category5=Cat5;
  109. Sum_Category = sum(of Category1-Category5);
  110. end;
  111. if last.rec_id;
  112. drop Cat1-Cat5 weight Category;
  113. run;


  114. proc sort data = Mbr_score;
  115. by Member_ID Main_Category;
  116. run;

  117. data Table4;set Mbr_score;
  118. retain Sum_Category_a Sum_Category_b Sum_Category_c Sum_Category_d;
  119. by Member_ID;
  120. if first.Member_ID then do;
  121. Sum_Category_a=0; Sum_Category_b=0;
  122. Sum_Category_c=0; Sum_Category_d=0;
  123. end;
  124. if Main_Category='a' then Sum_Category_a+Sum_Category;
  125. if Main_Category='b' then Sum_Category_b+Sum_Category;
  126. if Main_Category='c' then Sum_Category_c+Sum_Category;
  127. if Main_Category='d' then Sum_Category_d+Sum_Category;
  128. if last.Member_ID;
  129. keep Member_ID Sum_Category_a Sum_Category_b Sum_Category_c Sum_Category_d;
  130. run;
复制代码


使用道具

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

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

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

GMT+8, 2024-3-29 09:46