将 NA 替换为具有先前值的值

Replace NA with Value with Previous Value

我在 R 中创建的数据框中有一列。某个月后,值变为 NA。我想用 12 个月前的记录替换 NA。 R 中是否有一个函数可以让我执行此操作?还是我必须做一个循环?

所以 Jan-11 会变成 10,Feb-11 会变成 11,依此类推。

编辑:

我也试过:

for (i in 1:length(df$var)) { 
df$var[i] <- ifelse(is.na(df$var[i]), df$var[i - 12], 
df$var[i]) }

但整列最终都是 NA。

啊哈,从最后一条评论来看,您似乎想要一个 "chained" 延迟,它使用可用的那个月的最后一个值,无论您需要回溯多少年。

Jan-11 will show the value 10, but when it comes to Jan-12, it shows NA (when it should be 10).

这是一种首先按月分组,然后使用 tidyr::fill() 从该月的最后一个有效值开始填充的方法。

首先,一些假数据。 (顺便说一句,在您的问题中包含这样的内容会很有用,这样回答者就不必重新输入您的数字或生成新的数字。)

# Make fake data with 1 year values, 2 yrs NAs
library(lubridate)
set.seed(42);
data <- data.frame(
  dates = seq.Date(from = ymd(20100101), to = ymd(20121201), by = "month"),
  values = c(as.integer(rnorm(12, 10, 3)), rep(NA_integer_, 24))
)

# Group by months, fill within groups, ungroup.
library(tidyverse)
data_filled <- data %>%
  group_by(month = month(dates)) %>%
  fill(values) %>%
  ungroup() %>%
  arrange(dates)

我想不出没有循环的方法,但这应该能满足您的需求:

df <- data.frame(col1 = LETTERS[1:24],
             col2 = c(rnorm(12), rep(NA, 12)))
for(i in 1:nrow(df)) {
    if(is.na(df[i, 2])) {
    df[i, 2] <- df[i - 12, 2]
  }
}