我有一个总计为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;
答案 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;