如何根据数据框中的某些规则进行移动MAX?

时间:2011-01-18 02:52:56

标签: r

> days=Sys.Date()-1:70
> price=abs(rnorm(70))
> regular=rep(c(0,0,0,0,1,0,1,0,0,1),c(7,7,7,7,7,7,7,7,7,7))
> y=data.frame(cbind(days,price,regular))

y就像是       天价定期
1 14990 0.16149463 0
2 14989 1.69519358 0
3 14988 1.57821998 0
4 14987 0.47614311 0
5 14986 0.87016180 0
6 14985 2.55679229 0
7 14984 0.89753533 0

我想要的输出: 将另一列附加到y,其值是最近2个常规周内的最高价格。 因此,如果当前行是今天,那么如果过去2周,则获得过去14天(包括今天)的最高价格 是常规周,如果过去两周中有一周不是常规周,那么我需要再回头找到最大值 价格,因为我需要最后2个常规周的最高价格。我怎样才能做到这一点?或者我必须使用loop / if来做它?

顺便说一句,为什么日子就像14990,14989,在cbind之后(天,价格,常规)?在cbind之前,天就像 格式为“2010-12-23”。

1 个答案:

答案 0 :(得分:2)

假设如果常规== 1,则一天是常规的,对于每一行,我们考虑行1到i,删除非常规行并在没有行的情况下返回NA或返回最后14行中的最大行否则。

y <- data.frame(days, price, regular)
y$max <- sapply(1:nrow(y), function(i) with(subset(y[1:i, ], regular == 1), 
        if (length(regular) == 0) NA else max(tail(price, 14))))