【问题标题】:recursive replacement in RR中的递归替换
【发布时间】:2013-07-11 11:16:56
【问题描述】:

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

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

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

【问题讨论】:

标签: r indexing


【解决方案1】:

该操作称为“最后一次观察结转”,通常用于填补数据空白。这是时间序列的常见操作,因此在 package 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

【讨论】:

    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2018-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-09
      • 1970-01-01
      相关资源
      最近更新 更多