楼主: funwin
11879 50

再次求助 如何插入(补充)缺失月份的数据? [推广有奖]

41
losttemple 发表于 2010-1-7 01:12:34
再试试,奶奶的.

proc import out=tmp
  datafile='e:\test.xls' dbms=excel replace;
run;
data tmp2;
  set tmp;
  year=input(substr(strip(date),1,4),??best.);
  month=input(substr(strip(date),5),??best.);
run;
proc sort; by company product year month; run;

data tmp3;
  set tmp2;
  by company product year month;
  _lagy=lag(year);
  _lagm=lag(month);
  if first.product=0 then do;
    obs=_n_-1;
    do i = 1 to (12*(year-_lagy)+(month-_lagm)-1);
          set tmp2 point=obs;
          month=month+i;          year=year+ceil(month/12)-1;
          month=mod(month,12);
          if month=0 then month=12;
          output;
        end;
  end;
run;

data tmp4(drop=_lagy _lagm i);
   set tmp2 tmp3;
run;
proc sort; by company product year month; run;

42
funwin 发表于 2010-1-7 05:47:01
41# losttemple

谢谢您的code,我试着运算了一下,但还是不正确。以我给的数据test为例,一共4172个observations,最后补充完后应该是15257个observations,但用了你的code,最后的observataions是17741个。比如199012的obs是57个,那么补充的199101 199102月份的数据也应该是57个,但用你的code跑出来的这两个月份的obs只有56个。其他很多月份都有类似obs或多或少的问题。 无论如何,还是感谢您提供的帮助。
随便提一下,39楼的code,我运算过,是正确的。能得出我想要的。

43
losttemple 发表于 2010-1-7 11:36:36
我的为什么是56个呢,因为对于product='85220610',原始资料只有两条记录分别是date=19909和date=199012,就是说1990年的12月份是最后的可用资料,对于这种情况还要补充1991年1月和2月的吗?

对于我的为什么是17741条记录,举个例子你可以看product='00195710'的1998年是否补齐了(我看着是4到12月份都没有补,而我的把1998年全都补了)

还有我的结果要看year和month,不要看date

你再看一下,希望你是对的

44
funwin 发表于 2010-1-7 22:28:14
43# losttemple

谢谢你这么热心的帮助。
问题可能是你不知道我到底想要什么,我想要的是按月份补足缺失的值,而不是按产品来补。比如199012 有这个product='85220610',那么后面的补上的月份,也必须有这个产品。也就是说补上199101, 199102的产品个数,产品多少都和199012一样。
您的year month结果 我都已经转化为date了。
其实最主要的问题在于,我不是要按产品product来补充,而是按company, date来补充。比如199812有95个obs, 199903有92个obs, 那么中间缺少的199901 199902这两个月的obs也应该是95个,而且值和199812的一样。而用你的code,这些都不对了。
还是非常感谢你的讨论。

45
losttemple 发表于 2010-1-7 22:36:43
你想要的是按月份补足缺失的值,而不是按产品来补

哦,了解了哈

46
funwin 发表于 2010-1-8 01:15:40
39# lwien007

不好意思,又碰到一个问题,您的code没能解决这个问题:比如 有个company 给出了199103, 199303月份的数据,我需要补入199104--199302的数据都和199103月份一样,但运用您的code,1992年一整年的数据都没能补上,应该是code本身没有考虑到这个问题。
能否帮忙再完善一下您的code?不胜感激!!

47
funwin 发表于 2010-4-14 06:55:58
还是上面的问题,一直没有得到完全解答!!

希望lwien007能否完善一下你在39楼留下的code?

您的code运行完后,发现这么个问题:比如 有个company 给出了199103, 199303月份的数据,我需要补入199104--199302的数据都和199103月份一样,但运用您的code,1992年一整年的数据都没能补上,应该是code本身没有考虑到这个问题吧?

也希望哪位高人能帮忙解决一下!不胜感激!

48
jingju11 发表于 2010-4-14 21:19:50
funwin 发表于 2010-4-14 06:55
还是上面的问题,一直没有得到完全解答!!

希望lwien007能否完善一下你在39楼留下的code?

您的code运行完后,发现这么个问题:比如 有个company 给出了199103, 199303月份的数据,我需要补入199104--199302的数据都和199103月份一样,但运用您的code,1992年一整年的数据都没能补上,应该是code本身没有考虑到这个问题吧?

也希望哪位高人能帮忙解决一下!不胜感激!

  1. /*read data from EXCEL first*/
  2. PROC SORT OUT = FUNWIN; BY company date;
  3. DATA b;
  4. SET FUNWIN; BY company date;
  5. date1 = INPUT(LEFT(date), YYMMN6.);
  6. IF FIRST.date THEN nn = 0;
  7. nn+1;
  8. year = YEAR(date1); month = MONTH(date1); date_ = year*12+month;
  9. lagNN = LAG(nn); lagDATE_ = LAG(date_);
  10. RUN;
  11. PROC SQL NOPRINT; SELECT MAX(nn) INTO :nn FROM b; QUIT;
  12. DATA c;
  13. SET b; BY company date;
  14. LENGTH _date $6;
  15. ARRAY p{&nn} $ _TEMPORARY_; ARRAY lagP{&nn} $ _TEMPORARY_; ARRAY amt_{&nn} _TEMPORARY_; ARRAY lagAMT_{&nn} _TEMPORARY_;
  16. _date = CATS(year, PUT(month, Z2.));
  17. OUTPUT;
  18. p[nn] = product; amt_[nn] = amt;
  19. lagP[nn] = LAG(p[nn]); lagAMT_[nn] = LAG(amt_[nn]);
  20. IF (NOT FIRST.company AND FIRST.date) THEN DO;
  21.   IF (lagDATE_+1 < date_) THEN DO date_ = lagDATE_+1 TO date_-1 BY 1;
  22.    DO _N_ = 1 TO lagNN;
  23.     IF _N_ = 1 THEN  DO;  product = lagP[_N_]; amt = lagAMT_[_N_]; END;
  24.      ELSE DO; product = p[_N_]; amt = amt_[_N_];  END;
  25.     year = CEIL(date_/12)-1; month = date_-12*year; _date = CATS(year, PUT(month, Z2.));
  26.     OUTPUT;
  27.    END;
  28.   END;  
  29. END;
  30. KEEP company product amt year month _date; RENAME _date = date;
  31. RUN;
  32. PROC SORT OUT = final(DROP = year month); BY company year month;
  33. RUN;
复制代码
It takes me too much time for being active in this forum. Some questions spend me hours and hours, like the question I am working on. Anyhow, I have learned so much from so many people.

49
soporaeternus 发表于 2010-4-14 22:00:01
这里强人出没啊,认真学习下,看看自己能不能写出来
Let them be hard, but never unjust

50
funwin 发表于 2010-4-14 22:08:52
完美解决!高人呀!

在此非常感激jingju11,我的大部分问题都是通过你的热心帮忙解决的。

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

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