楼主: jjjn511
3188 19

[有偿编程] 按一定条件补全变量值 [推广有奖]

  • 0关注
  • 0粉丝

已卖:1份资源

硕士生

54%

还不是VIP/贵宾

-

威望
0
论坛币
197 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
1021 点
帖子
25
精华
0
在线时间
324 小时
注册时间
2009-7-15
最后登录
2016-6-3

楼主
jjjn511 发表于 2011-9-25 14:45:51 |AI写论文
20论坛币
sas数据表p98如下:


cncpc label ass
1 日本ass_1 Panasonic
1 ass_2 Sumsung
2 美国 ass_1 Vanderbilt
3 韩国 ass_1 Sumsung
3 ass_2 Panasonic

   数据表p98中只有ass_1变量有国籍,从ass_2开始国籍为空,但根据已有公司的国籍属性可以将部分国籍补全,比如上表中两个空着的部分都能够补全。请大侠帮忙。。。写下程序            
   [tr]  [td=86]
[/td][td=94]
[/td][td=94]
[/td][td=157]
[/td][/tr]
[tr][td]

[/td][td]

[/td][td]
[/td][td]




[/td][/tr]

最佳答案

webgu 查看完整内容

好像是要按已有的ass与cpc的对应值补全。试试下面的代码。
关键词:变量值 Panasonic label Sung Sums Panasonic 数据表 日本 韩国 美国

本帖被以下文库推荐

沙发
webgu 发表于 2011-9-25 14:45:52
YueweiLiu 发表于 2011-9-25 15:59
如果have数据集没有按cn排序,先排序,再运行上面程序。
好像是要按已有的ass与cpc的对应值补全。试试下面的代码。
  1. proc sort data=have;
  2.   by ass  descending cpc;
  3. run;
  4. data want;
  5.    do until(last.ass);
  6.      set have;
  7.      by ass;
  8.       length cpc0 $ 50;
  9.       retain cpc0 "";
  10.       if cpc^=" " then cpc0=cpc;
  11.       else cpc=cpc0;
  12.           output;
  13.         end;
  14.     drop cpc0;
  15. run;


  16. /*小改一下,谢谢YUE*/
  17. data want;
  18.   length cpctmp $50;
  19.   retain cpctmp "";
  20.     set have;
  21.     by ass;
  22. if cpc^="" then cpctmp=cpc;
  23.    else
  24.   cpc=cpctmp;
  25.   drop cpctmp;
  26. run;
复制代码

TM截图未命名.png (3.92 KB)

TM截图未命名.png

SAS资源
1. SAS 微信:StatsThinking
2. SAS QQ群:348941365

藤椅
YueweiLiu 发表于 2011-9-25 15:33:56
  1. data want;
  2.         set have;
  3.         length cpc0 $ 50;
  4.         retain cpc0 "";
  5.         if cpc^=" " then cpc0=cpc;
  6.         else cpc=cpc0;
  7.         drop cpc0;
  8. run;
复制代码

板凳
jjjn511 发表于 2011-9-25 15:51:14
我列出的只是个例子,实际上数据量很大,我不知道没有国籍的机构(ass_2)是否曾经出现在第一位(ass_1),如果出现则把国籍粘贴过来,如果一次都没出现在第一位,则一直都是空着的

报纸
YueweiLiu 发表于 2011-9-25 15:59:07
  1. data tmp;
  2.         set have;
  3.         if cpc^=" ";
  4.         keep cn cpc;
  5. run;

  6. data want;
  7.         merge have(in=aa) tmp;
  8.         by cn;
  9.         if aa;
  10. run;
复制代码
如果have数据集没有按cn排序,先排序,再运行上面程序。

地板
shenliang_111 发表于 2011-9-25 19:15:17
  1. /*人为改了一下数据集*/
  2. /*以下程序假定每一个ass有且只有一个不是缺失的cpc*/
  3. /*hash的好处在于楼主的海量数据,并不用排序*/
  4. data a;
  5. infile cards;
  6. input cn cpc $ label $ ass $;
  7. cards;
  8. 1  . ass_1  Panasonic
  9. 1   .   ass_2  Sumsung  
  10. 2 美国 ass_1 Vanderbilt
  11. 3 韩国 ass_1 Sumsung
  12. 3   日本  ass_2 Panasonic
  13. ;
  14. data result;
  15. length cpc ass $8;
  16. if _n_=1 then do;
  17. declare hash h();
  18. h.definekey(key:'ass');
  19. h.definedata(data:'cpc');
  20. h.definedone();
  21. call missing(ass,cpc);
  22. do until(last);
  23. set a end=last;
  24. if ^missing(cpc) then
  25. h.add();
  26. end;
  27. end;
  28. set a;
  29. if missing(cpc) then h.find();
  30. run;
复制代码

7
shenliang_111 发表于 2011-9-25 19:18:28
如果对于任意一个ass,其CPC都是缺失的,那也就没有了填补的需要,所以可以先筛选出那些CPC不是全部缺失的记录,然后再用上面的程序补全

8
shenliang_111 发表于 2011-9-25 19:36:42
  1. /*人为改了一下数据集*/

  2. /*以下程序假定每一个ass有且只有一个不是缺失的cpc*/

  3. /*hash的好处在于楼主的海量数据,并不用排序*/

  4. data a;

  5. infile cards;

  6. input cn cpc $ label $ ass $;

  7. cards;

  8. 1  . ass_1  Panasonic

  9. 1   .   ass_2  Sumsung  

  10. 2 美国 ass_1 Vanderbilt

  11. 3 韩国 ass_1 Sumsung

  12. 3   日本  ass_2 Panasonic
  13. 3  日本  ass_3  Panasonic

  14. ;
  15. /*如果每个ass对应多个cpc,则cpc一定都是相等的,则可以使用如下程序*/
  16. data result;

  17. length cpc ass $8;

  18. if _n_=1 then do;

  19. declare hash h();

  20. h.definekey(key:'ass');

  21. h.definedata(data:'cpc');

  22. h.definedone();

  23. call missing(ass,cpc);

  24. do until(last);

  25. set a end=last;
  26. rc=h.find();
  27. if ^missing(cpc) then do;
  28.    if rc=1 then h.add();
  29.    else h.replace();
  30. end;
  31. end;
  32. end;

  33. set a;

  34. if missing(cpc) then h.find();

  35. run;
复制代码

9
jingju11 发表于 2011-9-25 23:26:14
ass这个变量名是你自己起的吧。
ass_1就是屁股1的意思。半开玩笑。其实这也是一个老外给我讲的笑话。源于一个香港来的程序员对于英文语意的敏感度较低。我觉得我们应该尽量避免这一类的变量名。
京剧

10
jjjn511 发表于 2011-9-26 07:35:51
jingju11 发表于 2011-9-25 23:26
ass这个变量名是你自己起的吧。
ass_1就是屁股1的意思。半开玩笑。其实这也是一个老外给我讲的笑话。源于一 ...
虽然是笑话,不过您的善意提醒我非常接受,我刚开始接触SAS,很多东西都不懂,ass是assignee的意思,我当时问问题的时候怕很多人嫌变量太长麻烦而不回答我,所以才缩减的,呵呵。以后还有问题希望大侠多多指正啊!小女子在这谢过了

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-8 03:23