R中的递归替换

时间:2013-07-11 11:16:56

标签: r indexing

我正在尝试清理一些数据,并希望用前一个日期的值替换零。我希望以下代码可以工作,但它不是

temp = c(1,2,4,5,0,0,6,7)
temp[which(temp==0)]=temp[which(temp==0)-1]

返回

1 2 4 5 5 0 6 7

而不是

1 2 4 5 5 5 6 7

我希望的。 如果没有循环,有没有一种很好的方法呢?

2 个答案:

答案 0 :(得分:6)

该操作被称为"最后观察结果"通常用于填补数据空白。它是时间序列的常见操作,因此在包动物园中实现:

temp = c(1,2,4,5,0,0,6,7)

temp[temp==0] <- NA

library(zoo)
na.locf(temp)
#[1] 1 2 4 5 5 5 6 7

答案 1 :(得分:2)

你可以使用基本相同的逻辑,除非你想将它应用于使用rle

产生的值向量
temp = c(1,2,4,5,0,0,6,0)

o <- rle(temp)
o$values[o$values == 0] <- o$values[which(o$values == 0) - 1]
inverse.rle(o)
#[1] 1 2 4 5 5 5 6 6