用 tidyselect 替换_na?

Ben*_*ker 7 r tidyr tidyselect

假设我有一个包含一堆列的数据框,我想在其中进行相同的NA替换:

dd <- data.frame(x = c(NA, LETTERS[1:4]), a = rep(NA_real_, 5), b = c(1:4, NA))
Run Code Online (Sandbox Code Playgroud)

例如,在上面的数据框中,我想做一些类似 replace_na(dd, where(is.numeric), 0)替换NAcolumnsa和中的值的操作b

我可以

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)
Run Code Online (Sandbox Code Playgroud)

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

akr*_*run 6

如果我们需要动态地进行replacement 操作where(is.numeric),可以将其包装在across

library(dplyr)
library(tidyr)
dd %>%
   mutate(across(where(is.numeric), replace_na, 0))
Run Code Online (Sandbox Code Playgroud)

或者我们可以指定作为键/值对的replacealist

replace_na(dd, list(a = 0, b = 0))
Run Code Online (Sandbox Code Playgroud)

可以通过以下方式以编程方式创建:selecting 的列numeric,获取names,转换为键/值对deframe(或summarise与 0 一起使用),然后使用replace_na

library(tibble)
dd %>% 
  select(where(is.numeric)) %>%
  summarise(across(everything(), ~ 0)) %>%
  replace_na(dd, .)
Run Code Online (Sandbox Code Playgroud)

  • 第二个是我想避免的(因为很难以“tidyselect”/编程方式完成),第一个是我正在寻找的解决方案(向量应用程序)。一时半会儿无法接受。 (2认同)