楼主: funwin
2062 6

[原创博文] 请教高手,如何添加缺失的月份? [推广有奖]

  • 0关注
  • 2粉丝

硕士生

85%

还不是VIP/贵宾

-

威望
0 级
论坛币
177 个
通用积分
0
学术水平
0 点
热心指数
4 点
信用等级
0 点
经验
2256 点
帖子
192
精华
0
在线时间
131 小时
注册时间
2007-11-7
最后登录
2016-1-22

楼主
funwin 发表于 2010-3-28 01:32:10 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
我的数据中,有的公司的数据有丢失的月份,想把这些丢失的月份补充进去,该如何编code?
如下表:
company
date
sales
1001
200509
20
1001
200603
30
1016
200603
451
1016
200606
521
1016
200609
358
1016
2006012
650

增加新的行,至于新增的sales值则设为missing value ‘.’:
company
date
sales
1001
200509
20
1001
200510
.
1001
200511
.
1001
200512
.
1001
200601
.
1001
200602
.
1001
200603
30
1016
200603
451
1016
200604
.
1016
200605
.
1016
200606
521
1016
200607
.
1016
200608
.
1016
200609
358
1016
200610
.
1016
200611
.
1016
2006012
650

望指点一二!
二维码

扫码加我 拉你入群

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

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

关键词:请教高手 company missing compan sales 如何

回帖推荐

soporaeternus 发表于5楼  查看完整内容

一个笨办法,我觉得可以一个data步搞定,容我再想想

本帖被以下文库推荐

沙发
funwin 发表于 2010-3-28 07:20:46
自己顶一下,例子的数据输入可以:
Data a;
  input company $ date $;
  datalines;
1001 200509
1001 200603
1016 200603
1016 200606
1016 200609
1016 200612
;
run;
日期的调整 可以用:
data b;
set a;
date1=input(compress(date),yymmn6.);
date2=date1;
format date1 yymmn6.;
run;

藤椅
funwin 发表于 2010-3-28 07:25:19
上面的例子中sales忘了写了:
Data a;
  input company date sales;
  datalines;
1001 200509 20
1001 200603 30
1016 200603 451
1016 200606 521
1016 200609 358
1016 200612 650  
;
run;
data b;
set a;
date1=input(compress(date),yymmn6.);
date2=date1;
format date1 yymmn6.;
run;

板凳
funwin 发表于 2010-3-28 21:23:09

RE: 请教高手,如何添加缺失的月份?

can anyone give me any comment? i appreciate your concern.

报纸
soporaeternus 发表于 2010-3-28 22:31:44
  1. data a;
  2.   input company date:yymmn6. sales;
  3.   format date yymmn6.;
  4.   datalines;
  5. 1001 200509 20
  6. 1001 200603 30
  7. 1016 200603 451
  8. 1016 200606 521
  9. 1016 200609 358
  10. 1016 200612 650  
  11. ;
  12. run;

  13. proc sort data=a;by company descending date;run;quit;

  14. data b;
  15.         set a;
  16.         by company descending date;
  17.         D=intck("MONTH",date,lag(date));
  18.         if first.company then D=.;
  19. run;

  20. proc sort data=b;by company date;run;

  21. data c;
  22.         set b;
  23.         by company date;
  24.         if D^=. then do;
  25.         output;
  26.                 do i=1 to D-1 by 1;
  27.                         date=intnx("MONTH",date,1,"BEG");
  28.                         sales=.;
  29.                         output;
  30.                 end;
  31.         end;
  32.         else do;
  33.                 output;
  34.         end;
  35.         keep company date sales;
  36. run;
复制代码
一个笨办法,我觉得可以一个data步搞定,容我再想想

地板
soporaeternus 发表于 2010-3-28 23:30:09
  1. data a;
  2.   input company date:yymmn6. sales;
  3.   format date yymmn6.;
  4.   datalines;
  5. 1001 200509 20
  6. 1001 200603 30
  7. 1016 200603 451
  8. 1016 200606 521
  9. 1016 200609 358
  10. 1016 200612 650  
  11. ;
  12. run;

  13. proc sort data=a;by company date;run;quit;

  14. data b;
  15.         retain Stt_Dte End_Dte ;
  16.         set a;
  17.         by company  date;
  18.         Stt_Dte=lag(date);
  19.         End_Dte=date;
  20.         output;
  21.         if not first.company then do;
  22.                 do i=1 to intck("MONTH",Stt_Dte,End_Dte)-1;
  23.                         date=intnx("MONTH",Stt_Dte,i,"BEG");
  24.                         sales=.;
  25.                         output;
  26.                 end;
  27.         end;
  28.         keep company date sales;
  29. run;

  30. proc sort data=b;by company date;run;quit;
复制代码
一个data步啦,可是最后要多个排序,睡觉去了,哪位高手改改,可以让sales直接赋值给循环最后1条,上面循环多做一次就好了,也就不要排序了
明天来看结果......

7楼
funwin 发表于 2010-3-29 00:23:56
soporaeternus 发表于 2010-3-28 22:31
  1. data a;
  2.   input company date:yymmn6. sales;
  3.   format date yymmn6.;
  4.   datalines;
  5. 1001 200509 20
  6. 1001 200603 30
  7. 1016 200603 451
  8. 1016 200606 521
  9. 1016 200609 358
  10. 1016 200612 650  
  11. ;
  12. run;

  13. proc sort data=a;by company descending date;run;quit;

  14. data b;
  15.         set a;
  16.         by company descending date;
  17.         D=intck("MONTH",date,lag(date));
  18.         if first.company then D=.;
  19. run;

  20. proc sort data=b;by company date;run;

  21. data c;
  22.         set b;
  23.         by company date;
  24.         if D^=. then do;
  25.         output;
  26.                 do i=1 to D-1 by 1;
  27.                         date=intnx("MONTH",date,1,"BEG");
  28.                         sales=.;
  29.                         output;
  30.                 end;
  31.         end;
  32.         else do;
  33.                 output;
  34.         end;
  35.         keep company date sales;
  36. run;
复制代码
一个笨办法,我觉得可以一个data步搞定,容我再想想
已经满足我所需要的了,非常感谢!
虽然分了步骤,但是非常容易理解!感激不尽!

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

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