我在R中创建的数据框中有一列。一个月后,值变为NA。我想用12个月前的记录替换NA。 R中有我可以执行的功能吗?还是我必须做一个循环?
因此,11月1日将变为10,11月2月将变为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。
答案 0 :(得分:0)
啊哈,在最后一条评论中,听起来您像是一个“链式”滞后,它使用了该月可用的最后一个值,但是要追溯很多年。
Jan-11将显示值10,但是当涉及Jan-12时,它将显示 不适用(应为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)
答案 1 :(得分:0)
我想不出没有循环的方法,但这应该可以为您提供所需的信息:
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]
}
}