使用replace_na()的列数不确定

时间:2018-07-24 18:42:33

标签: r dplyr tidyr tidyeval

我的数据框如下:

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

但是我总是很难理解这段代码。预先感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

我们可以通过基于数据集的列数创建一个list为0的方法,并使用列名来设置名称

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或基本don条件mutate_if)并应用replace_all

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

使用base R,它更简单

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