全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学
2009-12-22 23:04:05
受益匪浅呵呵
二维码

扫码加我 拉你入群

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

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

2009-12-22 23:46:51
这问题也太高深了 看来还得好好学习Microsoft啊
二维码

扫码加我 拉你入群

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

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

2009-12-23 09:17:38
复制代码
二维码

扫码加我 拉你入群

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

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

2009-12-23 11:05:11
虽然还没有仔细看懂每一步,但初步测试了一下,是可行的!!!!
多谢 高手指点!容我再仔细研读一下!

33# lwien007
二维码

扫码加我 拉你入群

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

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

2009-12-23 16:04:56
33# lwien007

高人!多谢指教。
您的codes,好多语句都没有见过,能否详细解释一下?以便我更好的学习!
二维码

扫码加我 拉你入群

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

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

2010-1-4 19:35:57
33# lwien007
谢谢您的code,本以为已经实现我的目标,但在运行我的原数据后,还是发现有错误。我把原数据放在附件test中,运行您的code后,还是发现有些时间段补充的数据有问题:比如原数据给了199409,199410,199503的数据,所以我就希望能让199411,199412,199501,199502这四个缺失的月和199410的数据一样,但运行您的code后,发现这段时间内没有补充199411,199412的数据,而直接到199501了。不知是何原因?哪位大侠指点一下!

data test1;

set test;

by company date;

if first.date then i=0;

i+1;

date=input(compress(date),yymmn6.);

date2=date;

format date yymmn6.;

run;

data test2 (keep=company date product amt);


if 0 then set test1;


if _n_=1 then do;



declare hash h(dataset:'test1');

h.definekey('company','date2','i');


h.definedata(all:'yes');


h.definedone();



call missing(company,date2,product,amt,i);

end;

set test1;


by company date;


retain predate prei;

if first.company then output;


else do;

if first.date then do;

if year(date)=year(predate) then do;

if month(date)>month(predate)+1 then do;


curdate=date;


curproduct=product;


curamt=amt;

do j=month(predate)+1 to month(date)-1;

date2=predate;


do i=1 to prei;


rc=h.find();



if rc=0 then do;


date=mdy(j,01,year(date));



output;


end;


end;



end;




date=curdate;



product=curproduct;



amt=curamt;



output;

end;

else output;

end;


else if month(date)=1 then output;


else do;



curdate=date;



curproduct=product;




curamt=amt;


do j=1 to month(date)-1;


date2=predate;


do i=1 to prei;


rc=h.find();


if rc=0 then do;


date=mdy(j,01,year(curdate));


output;


end;


end;

end;




date=curdate;



product=curproduct;



amt=curamt;


output;


end;


end;

else output;


If last.date then do;


predate=date;


prei=i;


end;


end;

run;

附件列表

test.xls

大小:317 KB

 马上下载

二维码

扫码加我 拉你入群

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

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

2010-1-4 22:03:06
试试,没有check过
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_1;
  set tmp2;
  by company product year month;

  if first.year and month^=1 and first.product=0 then do;
    obs=_n_-1;
        _year=year;
    do i=1 to month-1;
      set tmp2 point=obs;
          month=i;
          year=_year;
      if _error_ then abort;
      output;
    end;
  end;

data tmp3_2;
  set tmp2;
  by company product year month;
  _lagmonth=lag(month);

  if first.year=0 then do;
    obs=_n_-1;
        do i=_lagmonth+1 to month-1;
          set tmp2 point=obs;
          month=i;
      if _error_ then abort;
      output;
    end;
  end;

data tmp3_3;
  set tmp2;
  by company product year month;

  if last.year=1 and last.product=0 and month^=12 then do;
    obs=_n_;
    do i=month+1 to 12;
          set tmp2 point=obs;
          month=i;
      if _error_ then abort;
      output;
    end;
  end;
run;

data tmp4;
  set tmp2 tmp3_1 tmp3_2 tmp3_3;
  drop i _year _lagmonth;
run;
proc sort; by company product year month; run;
二维码

扫码加我 拉你入群

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

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

2010-1-5 04:25:22
37# losttemple

谢谢您,但没有实现我想要的。
二维码

扫码加我 拉你入群

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

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

2010-1-5 10:52:44
看看这个是不是你想要的结果
proc import out=tmp
        datafile='e:\test.xls'
        dbms=excel replace;
        sheet='原始';
run;

data tmp2;
        set tmp(rename=(amt=quant));
        by company date;
        if first.date then i=0;
        i+1;
        date=input(compress(date),yymmn6.);
        date2=date;
        format date yymmn6.;
        label quant='quant';
run;

data tmp3(keep=date company product quant);
        if 0 then set tmp2;
        if _n_=1 then do;
               declare hash h(dataset:'tmp2');
               h.definekey('company','date2','i');
               h.definedata(all:'yes');
               h.definedone();
               call missing(company,date2,product,quant,i);
        end;
        set tmp2;
        by company date;
        retain predate prei;
        if first.company then output;
        else do;
             if first.date then do;
                     if year(date)=year(predate) then do;
                             if month(date)>month(predate)+1 then do;        
                                     curdate=date;
                                     curproduct=product;
                                     curquant=quant;
                                     do j=month(predate)+1 to month(date)-1;
                                             date2=predate;
                                             do i=1 to prei;
                                                    rc=h.find();
                                                     if rc=0 then do;
                                                             date=mdy(j,01,year(date));
                                                             output;
                                                     end;
                                             end;
                                     end;
                                    date=curdate;
                                     product=curproduct;
                                     quant=curquant;
                                     output;
                             end;
                            else output;
                     end;
                     else do;
                                                          if month(predate)<12 then do;
                          curdate=date;
                          curproduct=product;
                          curquant=quant;
                                                                  do j=month(predate)+1 to 12;
                                      date2=predate;
                                      do i=1 to prei;
                                               rc=h.find();
                                               if rc=0 then do;
                                                      date=mdy(j,01,year(predate));
                                                       output;
                                               end;
                                      end;
                                                                  end;
                         date=curdate;
                          product=curproduct;
                          quant=curquant;
                                                                end;
                                                                if month(date)=1 then output;
                             else do;
                                     curdate=date;
                                     curproduct=product;
                                     curquant=quant;
                                    do j=1 to month(date)-1;
                                            date2=predate;
                                            do i=1 to prei;
                                                     rc=h.find();
                                                     if rc=0 then do;
                                                            date=mdy(j,01,year(curdate));
                                                             output;
                                                     end;
                                            end;
                                     end;
                                     date=curdate;
                                     product=curproduct;
                                     quant=curquant;
                                    output;
                             end;
                                                        end;
             end;
             else output;
             if last.date then do;
                    predate=date;
                    prei=i;
                end;
        end;
        format predate curdate yymmn6.;
run;
二维码

扫码加我 拉你入群

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

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

2010-1-6 04:29:43
39# lwien007

初步测试了一下,可行。高手出招 迎刃而解! 佩服!
非常感谢你的帮忙!!
二维码

扫码加我 拉你入群

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

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

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;
二维码

扫码加我 拉你入群

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

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

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,我运算过,是正确的。能得出我想要的。
二维码

扫码加我 拉你入群

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

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

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

你再看一下,希望你是对的
二维码

扫码加我 拉你入群

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

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

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,这些都不对了。
还是非常感谢你的讨论。
二维码

扫码加我 拉你入群

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

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

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

哦,了解了哈
二维码

扫码加我 拉你入群

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

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

2010-1-8 01:15:40
39# lwien007

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

扫码加我 拉你入群

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

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

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

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

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

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

扫码加我 拉你入群

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

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

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本身没有考虑到这个问题吧?

也希望哪位高人能帮忙解决一下!不胜感激!
复制代码
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.
二维码

扫码加我 拉你入群

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

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

2010-4-14 22:00:01
这里强人出没啊,认真学习下,看看自己能不能写出来
二维码

扫码加我 拉你入群

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

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

2010-4-14 22:08:52
完美解决!高人呀!

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

扫码加我 拉你入群

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

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

2010-4-14 22:25:03
复制代码

source为原数据集
希望是对的,选了种我认为最简单的,,,,,,
二维码

扫码加我 拉你入群

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

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

栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群