【问题标题】:Replace NA in all columns of a dplyr chain在 dplyr 链的所有列中替换 NA
【发布时间】:2018-06-12 01:09:22
【问题描述】:

问题replace NA in a dplyr chain结果进入解决方案

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

使用 dplyr。我想用 dplyr 链估算所有列。没有要分组的单列,而是我希望所有数字列都将所有 NA 替换为列均值等手段。

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

【问题讨论】:

  • 使用dt %>% group_by(a) %>% mutate_all(funs(ifelse(is.na(.), mean(., na.rm = TRUE), .))如果你想要优雅,那么dt %>% group_by(a) %>% mutate_all(zoo::na.aggregate)
  • 这取决于你之后想要的操作。有时,我使用ungroup,因为spread 等可能不适用于组列
  • 如果您使用的是rowwise,请使用rowSums,即%>% ungroup %>% mutate(newSum = rowSums(.[columnsofinterest]))

标签: r dplyr tidyverse


【解决方案1】:

我们可以使用mutate_allifelse

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

如果我们想要一个紧凑的选项,请使用 zoo 中的 na.aggregate ,其中 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))

【讨论】:

  • @hhh a 仅来自您的代码。如果您有不同的分组变量,请使用那个
  • @hhh 那不就是一个行号列吗?我以为你想按某个列分组,然后根据它进行替换
  • @hhh 如果是行号,它只是一个唯一的元素。所以,您不需要任何group_by,只需在整个数据集上执行dt %&gt;% mutate_all(zoo::na.aggregate)) 或应用zoo::na.aggregate(dt)
  • 谢谢,他们在zoo::na.aggregate(data.frame(a=c(1,2,NaN),b=c(10,NaN,12)))data.frame(a=c(1,2,NaN),b=c(10,NaN,12)) %&gt;% zoo::na.aggregate() 工作。
猜你喜欢
  • 2014-03-10
  • 1970-01-01
  • 2019-11-05
  • 1970-01-01
  • 1970-01-01
  • 2020-08-13
  • 2016-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多