2015-01-10 20 views
0

与前值更换零我有这个时间序列为及时R系列

   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 
+1

是'df'数据框还是'xts'对象?将'dput(df)'的输出编辑到你的问题中。另外,添加所有相关的'library'调用。您应该阅读[本FAQ](http://stackoverflow.com/a/5963610/1412059)。 – Roland

+0

这是时间序列数据。我已经使用read.zoo(mydataframe,header = TRUE,format =“%Y-%m-%d”,sep =“\ t”)转换了数据帧。 –

+0

您是否阅读过'?replace'? – Henrik

回答

4

今后就请让您的问题自包含的,包括库调用和任何输入xdput(x)输出。

我们假设这是一个动物园对象,如最后所示。我们将称它为z,因为df表明它是一个数据框。

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 

注:该输入被用于:

z <- structure(c(400L, 400L, 400L, 125L, 120L, 200L, 200L, 200L, 100L, 
0L), .Dim = c(5L, 2L), .Dimnames = list(NULL, c("Quant1", "Quant2" 
)), index = structure(c(15723, 15725, 15726, 15727, 15728), class = "Date"), 
class = "zoo") 
+0

抱歉输入/输出数据。感谢您的关注。我已纠正它。 –

+0

删除了非负面假设。 –

+0

我已经更新了这个问题。尽管我尝试使用您的解决方案,但无法获得预期的结果。 –

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通过以下值作为你的榜样,你说你想通过以前的值在你的问题的标题替换替换零。尽管调整它到你真正的意思应该很容易。