【问题标题】:using replace_na() with indeterminate number of columns使用列数不确定的 replace_na()
【发布时间】:2019-01-01 11:38:18
【问题描述】:

我的数据框如下所示:

df <- tibble(x = c(1, 2, NA),
             y = c(1, NA, 3),
             z = c(NA, 2, 3))

我想使用 tidyr::replace_na() 将 NA 替换为 0。正如此函数的文档所明确指出的,一旦您知道要对哪些列执行操作,就可以直接执行此操作。

df <- df %>% replace_na(list(x = 0, y = 0, z = 0))

但是,如果您的列数不确定怎么办? (我说“不确定”是因为我正在尝试创建一个使用 dplyr 工具即时执行此操作的函数。)如果我没记错的话,与我尝试使用上述工具实现的基本 R 等效的是:

df[, 1:ncol(df)][is.na(df[, 1:ncol(df)])] <- 0

但我总是难以理解这段代码。提前感谢您的帮助。

【问题讨论】:

    标签: r dplyr tidyr tidyeval


    【解决方案1】:

    我们可以通过根据数据集的列数创建一个 0 的 list 并使用列名设置名称来做到这一点

    library(tidyverse)
    df %>% 
       replace_na(set_names(as.list(rep(0, length(.))), names(.)))
    # A tibble: 3 x 3
    #      x     y     z
    #   <dbl> <dbl> <dbl>
    #1     1     1     0
    #2     2     0     2
    #3     0     3     3
    

    或者另一个选项是mutate_all(对于选定的列-mutate_at或基本不条件mutate_if)和applyreplace_all

    df %>%
        mutate_all(replace_na, replace = 0)
    

    base R,更直接

    df[is.na(df)] <- 0
    

    【讨论】:

    • 哇塞。谢谢!
    猜你喜欢
    • 2018-08-26
    • 2018-07-16
    • 1970-01-01
    • 1970-01-01
    • 2018-01-16
    • 2017-07-30
    • 1970-01-01
    • 1970-01-01
    • 2016-08-03
    相关资源
    最近更新 更多