楼主: lulu66898
2495 5

如何迭代求和 [推广有奖]

  • 0关注
  • 1粉丝

博士生

31%

还不是VIP/贵宾

-

威望
0
论坛币
1671 个
通用积分
4.4127
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
643 点
帖子
48
精华
0
在线时间
461 小时
注册时间
2009-4-9
最后登录
2024-3-12

5论坛币
SAS小白求各位高手指导,我的基础数据如下:
indcd year X
a 20081
a 2009 2
a 2010 3
a 2011 4
a 2012 5
b2009 2
b 2010 3
b 2011 4
b 2012 5
...
我希望对于每一个indcd,计算当年和前2年(共3年)的X总和sum和均值avg。如对于indcd=a时,2010sum为6(1+2+3),2011sum为9(2+3+4)和2012sum为12(3+4+5)。
因为对于每一个Indcd,对应的year个数可能不同,有的是从2008-2012年,有的则是2009-2012年。

关键词:year 基础数据 IND Sum ear 如何 2011
data one;
input indcd $ year x;
cards;
a        2008        1
a        2009        2
a        2011        4
a        2010        3
a        2012        5
b        2010        3
b        2009        2
b        2011        4
b        2012        5
;;;
run;
data two;
set one;
by indcd;

if first.indcd then count=0;
count+1;
sum=x+lag(x)+lag2(x);

if count>=3 then sum=sum;
else sum=.;
mean=sum/3;

drop count;
run;

使用道具

藤椅
Tigflanker 发表于 2015-7-6 16:04:29 |只看作者 |坛友微信交流群
  1. data one;
  2. input indcd $ year X;
  3. cards;
  4. a 2008 1
  5. a 2010 3
  6. a 2011 4
  7. a 2012 5
  8. b 2009 2
  9. b 2010 3
  10. b 2011 4
  11. b 2012 5
  12. ;run;

  13. data two;
  14.   if 0 then set one(rename=X=Y);
  15.   if _n_ = 1 then do;
  16.     dcl hash h(dataset:'one(rename=X=Y)');
  17.         h.definekey('indcd','year');
  18.         h.definedata('Y');
  19.         h.definedone();
  20.   end;

  21.   set one;
  22.   sum = X;
  23.   if ~h.find(key:indcd, key:year - 1) then sum + Y;
  24.   if ~h.find(key:indcd, key:year - 2) then sum + Y;

  25.   drop Y;
  26. run;
复制代码
此处考虑:一个indcd、一个year下只有一个X
Bye SAS.
若有缘,能重聚。

使用道具

板凳
苹果叶 在职认证  发表于 2015-7-6 20:54:49 |只看作者 |坛友微信交流群
  1. proc sort data=a;
  2.   by indcd year x;
  3. run;

  4. proc transpose data=a out=a_tr;
  5.   by indcd;
  6.   var x;
  7.   id year;
  8. run;

  9. data final;
  10.   set a_tr;
  11.   sum2010=sum(of _2008-_2010);
  12. run;
复制代码

使用道具

报纸
huangpengfei 发表于 2015-7-7 20:29:40 |只看作者 |坛友微信交流群
proc sort data=test;
        by indcd year;
run;
data test1;
        set test;
        by indcd year;
        if first.indcd then n=1;
                else n+1;
        sum1=lag(x)+x;
        sum2=lag(sum1)+x;
        if n=1 or n=2 then
                do;
                        sum1=.;
                        sum2=.;
                end;
        drop n sum1;
run;

使用道具

地板
huangpengfei 发表于 2015-7-7 20:33:21 |只看作者 |坛友微信交流群
huangpengfei 发表于 2015-7-7 20:29
proc sort data=test;
        by indcd year;
run;
data test1;
        set test;
        by indcd year;
        if first.indcd then n=1;
                else n+1;
        sum=lag(x)+lag2(x)+x;
        if n=1 or n=2 then
                do;
                        sum=.;
                end;
        drop n ;
run;

使用道具

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

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

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

GMT+8, 2024-4-24 00:37