I have a data frame like this:
> head(df1)
iso year var1 var2 var3
1 XXX 2005 165 29 2151
2 XXX 2006 160 21 2139
3 XXX 2007 NA NA NA
4 XXX 2008 184 9 3640
5 XXX 2009 NA NA NA
6 YYY 2005 206 461 8049
我希望能够根据周围的年份和范围开头和结尾的
NA
,通过向前或向后传递最外层非NA
观测值来替换间歇性年份的NA
。以下是我为一个列编写的代码:
df1 %>%
group_by(iso) %>%
mutate(var1 = na.approx(var1, na.rm = FALSE, rule = 1)) %>%
mutate(var1 = na.locf(var1, na.rm = FALSE)) %>%
mutate(var1 = na.locf(var1, na.rm = FALSE, fromLast = TRUE))
这个方法可行,现在我希望能一次性对所有列进行操作(超过3列且不像示例中那样编号)。我从这个问题的答案中拼凑出了以下代码。我省略了两个调用na.locf
的语句。
columnnames <- c("var1, "var2", "var3")
df1 %>%
group_by(iso) %>%
mutate_at(.vars = vars(columnnames), .funs = funs(na.approx(., na.rm = FALSE, rule = 1)))
这个代码给我抛出了一个错误和一个警告:
错误在 approx(x[!na], y[!na], xout, ...) 中: 需要至少两个非 NA 值来进行插值 此外: 警告信息: In xy.coords(x, y, setLab = FALSE) : NAs introduced by coercion
我认为我理解了错误,但是当我在 var1 上使用第一段代码时没有遇到这个问题。我不明白警告的含义。我该如何将我的代码应用于数据框中的所有列?我还尝试将所有内容放入循环中,循环遍历 columnnames,但这也不起作用(而且这可能不是最好的方法)。
XXX
的2007年数据进行插值处理,作为2006年和2008年的平均值,但将2008年的数据应用于2009年? - avsmethod="constant"
时,它的工作方式类似于na.locf
。它会像na.locf
一样用最近的非 NA 值填充 NA 值,但也会用第一个非 NA 值填充前导的 NA 值。我已经在答案中添加了输出。请查看?na.approx
,对于method
和rule
参数,请查看?approx
。 - G. Grothendieckna.locf
,表明你想要使用这个功能。但是如果你想要使用周围点的线性插值,可以删除method = "constant"
参数,因为na.approx
的默认方法是使用线性插值。 - G. Grothendieck