在dplyr链的所有列中替换NA

时间:2018-01-02 10:16:33

标签: r dplyr tidyverse

问题replace NA in a dplyr chain导致解决方案

dt %.% group_by(a) %.% mutate(b = ifelse(is.na(b), mean(b, na.rm = T), b))

使用dplyr。我想用dplyr链来估算所有colums。没有单个列可以分组,而是我希望所有数字列都通过诸如列均值之类的方式替换所有NAs。

使用tidyverse / dp替换列方式的所有NA的最优雅方法是什么?

1 个答案:

答案 0 :(得分:8)

我们可以将mutate_allifelse

一起使用
dt %>%
   group_by(a) %>% 
   mutate_all(funs(ifelse(is.na(.), mean(., na.rm = TRUE), .)))

如果我们想要一个紧凑的选项,请使用na.aggregate中的zoo defaultNA值替换为mean

dt %>% 
   group_by(a) %>% 
   mutate_all(zoo::na.aggregate)

如果我们没有分组变量,请删除group_by并使用mutate_if(只是为了对某些非数字列保持谨慎)

dt %>%
   mutate_if(is.numeric, zoo::na.aggregate)

如果所有列都是数字,甚至

zoo::na.aggregate(dt)

数据

set.seed(42)
dt <- data.frame(a = rep(letters[1:3], each = 3),
                 b= sample(c(NA, 1:5), 9, replace = TRUE), 
                 c = sample(c(NA, 1:3), 9, replace = TRUE))