将 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]
}
}
我在 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]
}
}