楼主: 若水烟寒
3052 4

插补缺漏值,求问更简单方法 [推广有奖]

  • 3关注
  • 9粉丝

博士生

8%

还不是VIP/贵宾

-

威望
0
论坛币
1431 个
通用积分
33.2663
学术水平
14 点
热心指数
18 点
信用等级
12 点
经验
2716 点
帖子
183
精华
0
在线时间
175 小时
注册时间
2011-5-11
最后登录
2023-8-10

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
有一份这样test的数据,我想对它插补缺漏值,原则是:如果数据的第一个值缺漏,则插入第一个非缺漏的数据,对于其他的情况按照之前非缺漏的值插补。我的做法是按照下面的方法:
  1. data test;
  2. input x @@;
  3. cards;
  4. . . 1 2 . 3 . . 5
  5. ;
  6. run;

  7. proc sql noprint;
  8. select x into: x2
  9. from test where x~=.;
  10. quit;

  11. data t(keep=x);
  12. set test;
  13. retain x1;
  14. retain flag;
  15. if x~=. and flag=0 then do; flag=1;end;
  16. if _n_=1 and x=. then flag=0;
  17. if x=. and flag=0 then %do; x=&x2; %end;
  18. else
  19. if flag=1 and x~=. then x1=x;
  20. else x=x1;
  21. run;
复制代码


实际上我的方法用了宏,我想应该有直接用data步可以实现的做法……但是我没想出来,恳请各位大侠们解答一下~谢谢~


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:简单方法 缺漏值 proc sql RETAIN Select 简单方法

回帖推荐

沙发
老师她摸我 发表于 2012-12-31 23:17:20 |只看作者 |坛友微信交流群
  1. data test;
  2.         input x @@;
  3.         cards;
  4. . . 1 2 . 3 . . 5
  5. ;
  6. run;
  7. data test1;
  8.         set test;
  9.         retain x2;
  10.         if _n_=1 then do;
  11.                 set test(where=(x^=.) obs=1);
  12.                 x2=x;
  13.         end;
  14.         x1=lag(x);
  15.         if x=. and x1=. then x2=x2;
  16.                 else x2=max(x,x1);
  17.         keep x2;
  18.         rename x2=x;
  19. run;
复制代码

已有 1 人评分学术水平 热心指数 信用等级 收起 理由
若水烟寒 + 1 + 1 + 1 观点有启发

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

欢迎加入SAS群:144839730-蜗牛

使用道具

藤椅
yongyitian 发表于 2013-1-1 07:12:03 |只看作者 |坛友微信交流群
data test;
input x @@;
cards;
. . 1 2 . 3 . . 5
;run;
/* step 1: add a sequence number ID and change the missing value to zero */
data test_1;
    id = _n_;
     set test;
         if x = . then y = 0;
            else y=x;
run;

/* Step 2: reverse the order of the data by ID */
proc sort data=test_1 out=test_revers;
    by descending id;
run;

/* Step 3: create a lag variable */
data test_2;
     set test_revers;
        y_lag = lag(y);
run;

/* step 4: fill the missing value */
data test_3;
    set test_2;
        retain z;
    if _n_ = 1 and y~=. then  z = y;
        else if  y = 0 and y - y_lag < 0 then z = y_lag;
           else if y = 0 and y_lag = 0 then z = z;
        else z = y;
        drop y y_lag;
run;

/* change the order back */
proc sort data=test_3 out = test_4;
     by ID;
run;

data test_result (rename = (x=z));
    set test_4 (keep=z);
run;
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
若水烟寒 + 1 + 1 + 1 观点有启发

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

使用道具

板凳
若水烟寒 发表于 2013-1-3 20:20:34 |只看作者 |坛友微信交流群
老师她摸我 发表于 2012-12-31 23:17
感到那个if _n_=1那里很神奇……之前不知道还可以这样运行的~列的方向上处理总是觉得很别扭T_T

使用道具

报纸
luckychll 发表于 2013-2-18 18:00:03 |只看作者 |坛友微信交流群
很好的补缺方法

使用道具

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

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

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

GMT+8, 2024-4-26 11:15