使用tidyselect替换缺失值replace_na?

7
假设我有一个包含多个列的数据框,我想要对它们进行相同的 NA 替换:
dd <- data.frame(x = c(NA, LETTERS[1:4]), a = rep(NA_real_, 5), b = c(1:4, NA))

例如,在上面的数据框中,我想要做类似于 replace_na(dd, where(is.numeric), 0) 的事情,以替换列 ab 中的 NA 值。
我可以这样做:
num_cols <- purrr::map_lgl(dd, is.numeric)
r <- as.list(setNames(rep(0, sum(num_cols)), names(dd)[num_cols]))
replace_na(dd, r)

但我正在寻找更整洁/更习惯/更好的东西...

1个回答

6

如果我们需要动态地使用 where(is.numeric) 来进行 replace,可以将其包装在 across 中。

library(dplyr)
library(tidyr)
dd %>%
   mutate(across(where(is.numeric), replace_na, 0))

或者我们可以将replace指定为一个键/值对的list

replace_na(dd, list(a = 0, b = 0))

可以通过编程方式创建,方法是 select 数值型列的名称,然后使用 deframe 将其转换为键/值对(或使用 summarise 并将其设置为0),最后使用 replace_na 替换缺失值。

library(tibble)
dd %>% 
  select(where(is.numeric)) %>%
  summarise(across(everything(), ~ 0)) %>%
  replace_na(dd, .)

2
第二个解决方案我想要避免(因为它很难使用tidyselect/编程方式实现),第一个是我正在寻找的解决方案(矢量应用)。暂时还不能接受。 - Ben Bolker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接