使用 starts_with() 将 NA 替换为 0

7
我尝试替换我的中一组特定列的NA值。这些列都以相同的前缀开头,因此我想知道是否有一种简洁的方法可以利用包中的函数来实现这一点。
我在Stack Overflow上看到了几个类似的问题,但它们都需要使用特定的列名称或位置。我真的很懒,不想定义所有列,只想定义前缀。
我尝试了包中的函数,但并没有成功。我知道我目前的代码是错误的,但我的词汇量不够大,不知道该去哪里找正确答案。
示例代码:
library(tidyverse)

tbl1 <- tibble(
 id = c(1, 2, 3),
 num_a = c(1, NA, 4),
 num_b = c(NA, 99, 100),
 col_c = c("d", "e", NA)
)

replace_na(tbl1, list(starts_with("num_") = 0)))
1个回答

11

您可以考虑使用mutate_atif_else(或case_when)来替换感兴趣的列中的所有NA为0。

mutate_at(tbl1, vars( starts_with("num_") ), 
          funs( if_else( is.na(.), 0, .) ) )

# A tibble: 3 x 4
     id num_a num_b col_c
  <dbl> <dbl> <dbl> <chr>
1     1     1     0     d
2     2     0    99     e
3     3     4   100  <NA>
请注意starts_with和其他选择助手返回一个整数向量,给出匹配变量的位置。我在尝试在超出我通常使用它们的情况下使用它们时,总是要记住这一点。
在更新版本的dplyr中,请改用带有波浪符号的list()代替funs():
list( ~if_else( is.na(.), 0, .) )

5
两种略微不同的方法 - 不知道哪个更好:mutate_at(tbd1, vars(starts_with('num_')), funs(replace(., is.na(.), 0)))mutate_at(tbd1, vars(starts_with('num_')), funs(replace_na(., 0))) - sbha
1
在一些更新版本的dplyr中,你应该写成~if_else( is.na(.), 0, .) )而不是funs()。 - Fitzroy Hogsflesh

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