2

我正在尝试清理一些数据,并想用前一个日期的值替换零。我希望以下代码有效,但它没有

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

这是我所希望的。有没有一种不循环的好方法?

4

2 回答 2

6

该操作称为“最后一次观察结转”,通常用于填补数据空白。这是时间序列的常见操作,因此在包 zoo 中实现:

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
于 2013-07-11T11:21:45.293 回答
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
于 2013-07-11T11:24:33.950 回答