我正在尝试清理一些数据,并想用前一个日期的值替换零。我希望以下代码有效,但它没有
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
这是我所希望的。有没有一种不循环的好方法?
该操作称为“最后一次观察结转”,通常用于填补数据空白。这是时间序列的常见操作,因此在包 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
您基本上可以使用相同的逻辑,除非您想将其应用于使用产生的值向量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