我有这个数据框
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)
但这不起作用,因为日期列。
您可以使用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)