我有这个时间序列
Quant1 Quant2
2013-01-23 400 200
2013-01-22 0 0
2013-01-21 0 0
2013-01-20 125 100
2013-01-18 120 0
并希望输出为
Quant1 Quant2
2013-01-23 400 200
2013-01-22 125 100
2013-01-21 125 100
2013-01-20 125 100
2013-01-18 120 0
我正在尝试这个,但它似乎不起作用。我得到了null error NULL Warning encountered while processing method
replace(df,df == 0, NA)
df <- na.locf(df)
df[is.na(df)] <- 0
有什么建议吗?
更新
根据我尝试的最多投票答案(我修改了输入日期)
> z <- structure(c(400L, 0L, 0L, 125L, 120L, 200L, 0L, 0L, 100L,
+ 0L), .Dim = c(5L, 2L), .Dimnames = list(NULL, c("Quant1", "Quant2"
+ )), index = structure(c(15728, 15727, 15726, 15725, 15723), class = "Date"),
+ class = "zoo")
> z
Quant1 Quant2
2013-01-23 400 200
2013-01-22 0 0
2013-01-21 0 0
2013-01-20 125 100
2013-01-18 120 0
> L <- rowSums(z != 0) > 0
> z[] <- coredata(z)[which(L)[cumsum(L)],]
> z
Quant1 Quant2
2013-01-23 400 200
2013-01-22 0 0
2013-01-21 0 0
2013-01-20 0 0
2013-01-18 120 0
答案 0 :(得分:4)
将来请将您的问题设为自包含,包括库调用和任何输入dput(x)
的{{1}}输出。
我们假设这是一个动物园对象,如末尾所示。我们将其称为z,因为df建议它是一个数据帧。
x
,并提供:
library(zoo)
L <- rowSums(z != 0) > 0
z[] <- coredata(z)[which(L)[cumsum(L)],]
注意:使用了此输入:
> z
Quant1 Quant2
2013-01-18 400 200
2013-01-20 400 200
2013-01-21 400 200
2013-01-22 125 100
2013-01-23 120 0
答案 1 :(得分:0)
我还假设它是一个动物园对象,并手工构建以下函数,只关注Quant1为零。 与Grothendieck先前的方法相比,它不那么优雅并且可能更慢(一个应该用一些应用函数替换for循环),但对你来说可能有些启发。
require(zoo)
times <- as.POSIXct(c("2013-01-18", "2013-01-20", "2013-01-21", "2013-01-22", "2013-01-23", "2013-01-25", "2013-01-29", "2013-02-02", "2013-02-04"))
quant1 <- c(400,0,0,125,120,0,70,0,0)
quant2 <- c(200,0,0,100,0,300,150,80, 200)
z <- zoo(data.frame(Quant1 = quant1, Quant2 = quant2), order.by = times)
repl_zeros <- function (z) {
diffs <- c(0, diff(as.numeric(z$Quant1 == 0)))
beginnings <- which(diffs == 1)
ends <- which(diffs == -1) - 1
valueindices <- ends + 1
for (i in 1:length(valueindices)) {
z[beginnings[i]:ends[i],]$Quant1 <- z[valueindices[i],]$Quant1
z[beginnings[i]:ends[i],]$Quant2 <- z[valueindices[i],]$Quant2
}
z
}
注意:repl_zeros会按照示例中的值替换零,您可以在其中表示要替换问题标题中的先前值。尽管如此,将它调整到你真正的意思应该很容易。