楼主: Rock2000
1752 7

[有偿编程] 怎样用下次记录填补前次记录 [推广有奖]

  • 1关注
  • 24粉丝

已卖:6892份资源

学术权威

23%

还不是VIP/贵宾

-

威望
1
论坛币
104790 个
通用积分
51.9656
学术水平
55 点
热心指数
74 点
信用等级
48 点
经验
23510 点
帖子
520
精华
0
在线时间
10924 小时
注册时间
2004-5-27
最后登录
2025-11-12

楼主
Rock2000 发表于 2013-8-17 13:48:17 |AI写论文
10论坛币
有以下数据
  1. id name sex cishu marry
  2. 1 张三  男  1     
  3. 1 张三  男  2     未婚
  4. 1 张三  男  3     已婚
  5. 2 李四  女  1     
  6. 2 李四  女  2     未婚
复制代码

想填补成以下数据,怎样实现?
  1. id name sex cishu marry
  2. 1 张三  男  1     未婚
  3. 1 张三  男  2     未婚
  4. 1 张三  男  3     已婚
  5. 2 李四  女  1     未婚
  6. 2 李四  女  2     未婚
复制代码



最佳答案

yongyitian 查看完整内容

把上面的code改了一点. 如果需要还可以再 sort by name cishu 后重新运行这段程序。 proc sort data=a out=a_Dsort; by name descending cishu; run; data b; set a_Dsort; by name; retain marry1; if first.name then do; if marry ne " " then marry1=marry; else call missing(marry1); end; else do; if missing(marry) then marry = marry1; else marry1 ...
关键词:Marry name SEX ARR CIS 记录

沙发
yongyitian 发表于 2013-8-17 13:48:18
把上面的code改了一点.
如果需要还可以再 sort by name cishu 后重新运行这段程序。


proc sort data=a out=a_Dsort; by name descending cishu;
run;

data b;
   set a_Dsort;
   by name;
   retain marry1;
   if first.name then do;
      if marry ne " " then marry1=marry;
      else call missing(marry1);
   end;
   else do;
      if missing(marry) then marry = marry1;
      else marry1 = marry;
   end;  
   drop marry1;
run;
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
Rock2000 + 5 + 5 + 1 热心帮助其他会员

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

藤椅
Imasasor 发表于 2013-8-17 15:32:09
给一个n=_n_;
然后再sort by name descending n;
然后再retain就行了
已有 1 人评分热心指数 信用等级 收起 理由
Rock2000 + 5 + 1 热心帮助其他会员

总评分: 热心指数 + 5  信用等级 + 1   查看全部评分

欢迎加入亚太地区第一R&Python数据挖掘群: 251548215;

板凳
Imasasor 发表于 2013-8-17 16:10:48
弄一弄就行了,给你说这么清楚了
欢迎加入亚太地区第一R&Python数据挖掘群: 251548215;

报纸
Rock2000 发表于 2013-8-17 20:29:07
版主,是否这样?是否有更好的?
  1. data a;
  2. input id name$  sex$  cishu marry$ @@;
  3. cards;
  4. 1 张三  男  1     .
  5. 1 张三  男  2     未婚
  6. 1 张三  男  3     已婚
  7. 2 李四  女  1     .
  8. 2 李四  女  2     未婚
  9. ;
  10. run;


  11. proc sort data=a; by name descending cishu;
  12. run;

  13. data b; set a;
  14. by name descending cishu;
  15. retain marry1;
  16. missing marry;
  17. if marry ne " " then marry1=marry;
  18. else marry=marry1;
  19. drop marry1;
  20. run;

  21. proc print data=b; run;

复制代码


地板
Rock2000 发表于 2013-8-17 20:58:12
以上程序还有问题,假如数据是如下缺失,王五的marry两次是缺失的。
  1. 1 张三  男  1     .
  2. 1 张三  男  2     未婚
  3. 1 张三  男  3     已婚
  4. 2 李四  女  1     .
  5. 2 李四  女  2     未婚
  6. 3 王五  男  1     .
  7. 3 王五  男  2     .
复制代码
如果用上程序,则变成王五的marry不是缺失的,这样不对,运行后结果如下:
  1. Obs    id    name    sex    cishu    marry

  2. 1      2    李四    女       2      未婚
  3. 2      2    李四    女       1      未婚
  4. 3      3    王五    男       2      未婚
  5. 4      3    王五    男       1      未婚
  6. 5      1    张三    男       3      已婚
  7. 6      1    张三    男       2      未婚
  8. 7      1    张三    男       1      未婚
复制代码
谁帮忙修正王五的marry还是缺失的?

7
Rock2000 发表于 2013-8-18 10:00:30
yongyitian 发表于 2013-8-17 13:48
把上面的code改了一点.
如果需要还可以再 sort by name cishu 后重新运行这段程序。
谢谢yongyitian,我把完整需求、程序代码贴上方便其他人验证,其他朋友也可以用其他方法实现。
  1. /*有如下数据*/
  2. /*id name sex cishu marry*/
  3. /*1 张三  男  1     */
  4. /*1 张三  男  2     未婚*/
  5. /*1 张三  男  3     已婚*/
  6. /*2 李四  女  1     */
  7. /*2 李四  女  2     未婚*/
  8. /*3 王五  男  1     .*/
  9. /*3 王五  男  2     .*/
  10. /**/
  11. /*如何变成如下数据*/
  12. /*id name sex cishu marry*/
  13. /*1 张三  男  1     未婚*/
  14. /*1 张三  男  2     未婚*/
  15. /*1 张三  男  3     已婚*/
  16. /*2 李四  女  1     未婚*/
  17. /*2 李四  女  2     未婚*/
  18. /*3 王五  男  1     .*/
  19. /*3 王五  男  2     .*/
  20. /**/
  21. /*解决思路如下:1.以相同id或name(最好id,name有相同的)为单位进行操作;
  22.                2.采用retain语句,保留相同ID的某变量的值,这里需降序排序。
  23.   方法如下*/

  24. data a;
  25. input id name$  sex$  cishu marry$ @@;
  26. cards;
  27. 1 张三  男  1     .
  28. 1 张三  男  2     未婚
  29. 1 张三  男  3     已婚
  30. 2 李四  女  1     .
  31. 2 李四  女  2     未婚
  32. 3 王五  男  1     .
  33. 3 王五  男  2     .
  34. ;
  35. run;


  36. proc sort data=a out=a_Dsort; by id descending cishu; /*以变量“ID”及“cishu”的降序(descending)排序*/
  37. run;

  38. data b;
  39.    set a_Dsort;
  40.    by id;
  41.    retain marry1;
  42.    if first.id then do;
  43.       if marry ne " " then marry1=marry;
  44.       else call missing(marry1);
  45.    end;
  46.    else do;
  47.       if missing(marry) then marry = marry1;
  48.       else marry1 = marry;
  49.    end;
  50.    drop marry1;
  51. run;

  52. proc print data=b; run;
复制代码

8
txyw 在职认证  发表于 2014-9-30 15:32:35
其实是不是LOCF结转法啊!

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-29 06:18