SAS汇总数组

时间:2017-07-05 15:58:14

标签: arrays sas

我有一个总计为210天的数组。我需要找到所有90天范围的总和。新数组是med_sum。所以med_sum(1)= sum(总计(32)-total(121)),然后med_sum(2)= sum(总计(33)-total(122)),等等,90个不同的时间一路到med_sum(90)= sum(总(121) - 总(210))。 下面是语法,但sum(of)函数不允许我这样做并且输出错误。我尝试了很多不同的选择,但一直找不到有用的东西。 提前谢谢!!

data work.total_base_3;
set work.total_base_2;
array med_total(*) total1-total210;
array med_sum(*) avg1-avg90;
do i = 1 to 90;
med_sum(i)=sum(of med_total(i+31)-med_total(i+120));
end;
run;

2 个答案:

答案 0 :(得分:0)

这里有一个示例,您应该能够扩展到您的数据(因此,在您的情况下,您可以将3'更改为90')

案例1行数据:

data test;
keep obs;
do i=1 to 10;
   obs = i;
   output;
end;
run;

data test1;
set test;
keep obs sum;
array x[3];
retain x;
x[mod(_n_ -1,3)+1] = obs;
if (_n_ >= 3)then do;
   sum = 0;
   do i = 1 to 3;
      sum= sum + x[i];
   end;
end;
run;

案例2列中的数据(使用上面的测试数据集):

proc transpose data=test out=testrow;
var  obs;
run;

data test2;
set testrow;
array med_total(*) col1-col10;
array med_sum(8) ;
do i = 3 to 10;
  med_sum[i-2]=0;
  do j = 1 +(i-3) to i;
     med_sum(i-2)=med_sum[i-2] + med_total(j);
  end;
end;
run;

答案 1 :(得分:0)

您不能在变量列表中使用数组引用,只能使用实际变量名称。因此,您希望在窗口滑动时生成90个值的90个值。实质上你想要

avg1 = sum(of total32 - total121);
avg2 = sum(of total33 - total122);
avg3 = sum(of total34 - total123);

您可以使用宏逻辑生成该系列语句。但是,如果你看一下变量之间的关系,你可以看到

med_sum(n+1) = sum(med_sum(n),med_total(n+1+120),-1*med_total(n+31));

所以你的循环看起来像:

med_sum(1) = sum(of total32-total121);
do n=1 to dim(med_sum)-1;
  med_sum(n+1) = sum(med_sum(n),med_total(n+1+120),-1*med_total(n+31));
end;