【问题标题】:Fill missing value based on previous values [duplicate]根据以前的值填充缺失值[重复]
【发布时间】:2016-06-29 12:54:12
【问题描述】:

我有以下向量:

v <- c(2L, 2L, NA, NA, NA, NA, 8L, NA)

如何将缺失值替换为上一个系列的值 + 1,使其变为:

c(2L, 2L, 3L, 3L, 3L, 3L, 8L, 9L)

【问题讨论】:

  • 你是search 还是尝试一下?
  • package zoo 有相应的工具

标签: r


【解决方案1】:

如前所述,zoo 有一个 last-observation-carried-forward 函数。我们可以添加一个:

library(zoo)
v2 <- na.locf(v) 
v2[is.na(v)] <- v2[is.na(v)] + 1L
#[1] 2 2 3 3 3 3 8 9

【讨论】:

  • 或一行:ifelse(is.na(v), na.locf(v) + 1L, v)
  • 另一个选项可能是cummax(pmax(pmin(v, lag(v)+1, na.rm=TRUE), 0, na.rm=TRUE))
【解决方案2】:

它既不漂亮也不高效,但它得到了你想要的答案。希望其他人能够发布一些更好的代码,但这应该可以帮助您入门。

v <- c(2L, 2L, NA, NA, NA, NA, 8L, NA)
last <- NA
vec <- vector()
for (i in 1:length(v)) {
    cur <- v[i]
    if (! is.na(cur) ) {
        val <- cur
        last <- cur
    }
    else  val <- last + 1
    vec[i] <- val
}

vec

【讨论】:

  • 我应该更具体一些。你是对的,用循环很容易做到。想知道是否有 dplyr 或其他软件包的优雅解决方案。
猜你喜欢
  • 2020-04-13
  • 1970-01-01
  • 1970-01-01
  • 2019-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-07
  • 2020-12-07
相关资源
最近更新 更多