SAS:向后看的数据步骤来计算平均值

时间:2013-03-30 03:40:08

标签: sas

很抱歉"没有真正提供信息"这篇文章的标题。 我在SAS中有以下数据集:

time Add    time_delete
5    3.00   5
5    3.15   11
5    3.11   11
8    4.21   8
8    3.42   8
8    4.20   11
11   3.12   .

time对应于每3分钟拍卖中新添加的(Add)价格。此价格可以在同一时间间隔内或之后删除,如time_delete所示。我的目标是计算每Addtime字段的平均价格。例如,我time=5的平均价格为(3.15+3.11)/2,因为3.00在该时间间隔内被删除。然后,time=8的平均价格为(4.20+3.15+3.11)/3。正如您所看到的,我必须查看当前的站立时间并回顾一下,看看哪个价格仍然有效time=8。此外,我想有一个字段,每time我知道可用的最高价格未被删除。 有帮助吗?

1 个答案:

答案 0 :(得分:2)

这里有一个滚动总和的变体。没有一个直接的解决方案(尤其是你无疑会有一些未提及的并发症);但这里有一些指示。

首先,您可能想要更改数据的格式。如果每个可能的时间点都有一行而不是一行,这实际上是一个相对容易解决的问题。

data have;
input time Add    time_delete;
datalines;
5    3.00   5
5    3.15   11
5    3.11   11
8    4.21   8
8    3.42   8
8    4.20   11
11   3.12   .
;;;;
run;

data want;
set have;
if time=time_delete then delete;
else do time=time to time_delete-1;
  output;
end;
keep time add;
run;

proc means data=want mean max n;
class time;
var add;
run;

您可以将proc方法输出到数据集并使其具有最大值加上平均值,然后将其放回主数据集或您需要的任何内容。

这方面的主要缺点是它是一个更大的数据集,因此如果您正在查看数十万个数据点,这可能不是您的最佳选择。

你也可以在没有额外行的情况下在SQL中执行此操作,尽管这是“其他并发症”可能会给事情带来麻烦的地方。

proc sql;
select H.time, mean(V.add), max(V.add) from (
    select distinct H.time from have H
    left join
    (select * from have) V
    on V.time le H.time
    and V.time_delete gt H.time )
    group by 1;
;
quit;

相当简单快速的查询,除非你有很多时间值,否则执行连接可能需要一些时间。

其他选择:

  • 将数据读入数组,第二个数组跟踪删除点。这可能会有点复杂,因为您可能需要通过删除点对数组进行排序 - 因此,您需要将一堆记录向下移动,而不是仅仅添加新记录。 SAS对于这种操作并不像c型语言那样友好。

  • 使用哈希表解决方案。比数组稍微麻烦一点,特别是因为你可以比两个单独的数组更容易地对哈希表进行排序。

  • 使用IML和矢量。与阵列解决方案类似,但具有更强大的操作技术。