R dplyr - 如果将 NA 替换为 0

1 r dplyr

我有这个数据框

dtf <- data.frame(
    id = seq(1, 4),
    amt = c(1, 4, NA, 123),
    xamt = c(1, 4, NA, 123),
    camt = c(1, 4, NA, 123),
    date = c("2020-01-01", NA, "2020-01-01", NA),
    pamt = c(1, 4, NA, 123)
)
Run Code Online (Sandbox Code Playgroud)

如果 colname 是数字,我想替换所有 NA 值,在我的例子中是 amt、xamt、pamt 和 camt。我正在寻找 dplyr 方式。通常我会使用

replace(is.na(.), 0)
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为日期列。

Ron*_*hah 5

您可以使用across

library(dplyr)
dtf %>% mutate(across(where(is.numeric), ~replace(., is.na(.), 0)))
#mutate_if for dplyr < 1.0.0
#dtf %>% mutate_if(is.numeric, ~replace(., is.na(.), 0))
Run Code Online (Sandbox Code Playgroud)

您还可以使用replace_na来自tidyr

dtf %>% mutate(across(where(is.numeric), tidyr::replace_na, 0))

#  id amt xamt camt       date pamt
#1  1   1    1    1 2020-01-01    1
#2  2   4    4    4       <NA>    4
#3  3   0    0    0 2020-01-01    0
#4  4 123  123  123       <NA>  123
Run Code Online (Sandbox Code Playgroud)

正如 @Darren Tsai 所建议的,我们也可以使用coalesce.

dtf %>% mutate(across(where(is.numeric), coalesce, 0))
Run Code Online (Sandbox Code Playgroud)