很抱歉"没有真正提供信息"这篇文章的标题。
我在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
所示。我的目标是计算每Add
个time
字段的平均价格。例如,我time=5
的平均价格为(3.15+3.11)/2
,因为3.00
在该时间间隔内被删除。然后,time=8
的平均价格为(4.20+3.15+3.11)/3
。正如您所看到的,我必须查看当前的站立时间并回顾一下,看看哪个价格仍然有效time=8
。此外,我想有一个字段,每time
我知道可用的最高价格未被删除。
有帮助吗?
答案 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和矢量。与阵列解决方案类似,但具有更强大的操作技术。