【发布时间】:2018-12-22 04:37:47
【问题描述】:
我有一个这样的数据框:
> 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 个,并且它们没有像我的示例中那样编号)。这是我从this 问题的答案拼凑而成的。我省略了对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 值进行插值 另外:警告信息: 在 xy.coords(x, y, setLab = FALSE) 中:强制引入的 NAs
我想我理解了这个错误,但是当我在var1 上使用第一段代码时我没有得到它。我不遵守的警告。如何将代码应用于数据框中的所有列?我还尝试将evertything 放在一个循环中,循环columnnames,但这也不起作用(它可能不是解决此问题的最佳方法)。
【问题讨论】: