r - 使用 dplyr 在多列上按组插入 NA

标签 r dplyr na zoo

我有一个这样的数据框:

> 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)))
这会给我一个错误和警告:

Error in approx(x[!na], y[!na], xout, ...) : need at least two non-NA values to interpolate In addition: Warning message: In xy.coords(x, y, setLab = FALSE) : NAs introduced by coercion


我想我理解错误,但是当我在 var1 上使用第一段代码时我没有得到它.我不遵循的警告。如何将代码应用到数据框中的所有列?我还尝试将所有内容放入循环中,循环遍历 columnnames但这也不起作用(这可能不是解决此问题的最佳方法)。

最佳答案

使用 na.approxmethod = "constant" (与 na.locf 相同)和 rule = 2 (意味着将最接近的值扩展到前导和尾随 NA)。如果您希望对 NA 进行线性插值,请删除 method="constant"争论。

df1 %>%
  group_by(iso) %>%
  mutate_at(vars(-iso), funs(na.approx(., method = "constant", rule = 2))) %>%
  ungroup

给予:
# A tibble: 6 x 5
  iso    year  var1  var2  var3
  <fct> <dbl> <dbl> <dbl> <dbl>
1 XXX    2005   165    29  2151
2 XXX    2006   160    21  2139
3 XXX    2007   160    21  2139
4 XXX    2008   184     9  3640
5 XXX    2009   184     9  3640
6 YYY    2005   206   461  8049

笔记
df1可重现的形式是:
df1 <- 
structure(list(iso = structure(c(1L, 1L, 1L, 1L, 1L, 2L), .Label = c("XXX", 
"YYY"), class = "factor"), year = c(2005L, 2006L, 2007L, 2008L, 
2009L, 2005L), var1 = c(165L, 160L, NA, 184L, NA, 206L), var2 = c(29L, 
21L, NA, 9L, NA, 461L), var3 = c(2151L, 2139L, NA, 3640L, NA, 
8049L)), class = "data.frame", row.names = c("1", "2", "3", "4", 
"5", "6"))

关于r - 使用 dplyr 在多列上按组插入 NA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51331188/

相关文章:

用 r 中的 bool 值替换数字

r - 每组过去窗口大小日期的总和

r - 按组缩放/标准化列

r - 如何创建一个依赖于先前观察到的事件的平均值的列?

R:在按日期匹配行后,用第二个 dfrm 中的值替换第一个 dfrm 中多列中的 NA 值

r - dplyr::mutate(分配 na.rm =TRUE)

r - 如何用最近两个值的平均值替换 NA

r - 如何使用记事本可以识别的换行符使用 R 保存 CSV 文件?

r - 使用 dplyr::select 排列列而不进行硬编码

r - 如何构建矩阵或表格