【问题标题】:replace NA with 0 using starts_with()使用 starts_with() 将 NA 替换为 0
【发布时间】:2017-11-27 12:39:27
【问题描述】:

我正在尝试替换 tibble 中一组特定列的 NA 值。这些列都以相同的前缀开头,所以我想知道是否有一种简洁的方法可以利用 dplyr 包中的 starts_with() 函数来允许我这样做。

我在 SO 上看到了其他几个问题,但是它们都需要使用特定的列名或位置。我真的很懒惰,不想定义所有列,只是前缀。

我尝试了tidyr 包中的replace_na() 函数,但无济于事。我知道我的代码对于作业来说是错误的,但我的词汇量不够大,不知道去哪里找。

代表:

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)))

【问题讨论】:

    标签: r na tidyverse


    【解决方案1】:

    mutate_atif_else(或case_when)一起使用怎么样?如果您想用 0 替换感兴趣的列中的所有 NA,则此方法有效。

    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, .) )
    

    【讨论】:

    • 两个细微的变化 - 不知道是否更好:mutate_at(tbd1, vars(starts_with('num_')), funs(replace(., is.na(.), 0)))mutate_at(tbd1, vars(starts_with('num_')), funs(replace_na(., 0)))
    • 在一些较新版本的 dplyr 中你应该写 ~if_else(is.na(.), 0, .) ) 而不是 funs()
    猜你喜欢
    • 2012-06-17
    • 2021-07-02
    • 2020-02-22
    • 2014-02-08
    • 2020-11-19
    • 2016-01-09
    • 2023-01-19
    相关资源
    最近更新 更多