如何在 20 列中将 NA 替换为 0?

How to substitute NA by 0 in 20 columns?

我想在 20 列中用 0 替换 NA。我发现这种方法适用于 2 列,但我想如果列数为 20,则它不是最优的。是否有其他更紧凑的解决方案?

mydata[,c("a", "c")] <-
        apply(mydata[,c("a","c")], 2, function(x){replace(x, is.na(x), 0)})

更新: 为简单起见,我们将此数据分为 8 列,并在 b、c、e、f 和 d

列中替换 NA
a  b  c  d  e  f  g  d
1  NA NA 2  3  4  7  6
2  g  3  NA 4  5  4  Y
3  r  4  4  NA t  5  5

结果必须是这个:

a  b  c  d  e  f  g  d
1  0  0  2  3  4  7  6
2  g  3  NA 4  5  4  Y
3  r  4  4  0  t  5  5

我们可以使用NAerqdap将NA转换为0。如果有多个列,循环使用lapply

library(qdap)
nm1 <- c('b', 'c', 'e', 'f')
mydata[nm1] <- lapply(mydata[nm1], NAer)
mydata
#  a b c  d e f g d.1
#1 1 0 0  2 3 4 7   6
#2 2 g 3 NA 4 5 4   Y
#3 3 r 4  4 0 t 5   5

或使用dplyr

library(dplyr)
mydata %>% 
   mutate_each_(funs(replace(., which(is.na(.)), 0)), nm1)
#  a b c  d e f g d.1
#1 1 0 0  2 3 4 7   6
#2 2 g 3 NA 4 5 4   Y
#3 3 r 4  4 0 t 5   5

另一个选项:

library(tidyr)
v <- c('b', 'c', 'e', 'f')
replace_na(df, as.list(setNames(rep(0, length(v)), v)))

给出:

#  a b c  d e f g d.1
#1 1 0 0  2 3 4 7   6
#2 2 g 3 NA 4 5 4   Y
#3 3 r 4  4 0 t 5   5

tidyr 中的 replace_na 函数可以应用于向量和数据帧 (http://tidyr.tidyverse.org/reference/replace_na.html)。

将其与 dplyrmutate_at 变体一起使用,以同时将其应用于多个列:

my_data %>% mutate_at(vars(b,c,e,f), replace_na, 0)

my_data %>% mutate_at(c('b','c','e','f'), replace_na, 0)

这里有一个tidyverse方法可以根据列的数据类型用不同的值替换 NA。

library(tidyverse)

dataset %>% mutate_if(is.numeric, replace_na, 0) %>%  
    mutate_if(is.character, replace_na, "")

另一个策略使用 tidyr::replace_na()

library(tidyverse)

df <- read.table(header = T, text = 'a  b  c  d  e  f  g  h
1  NA NA 2  3  4  7  6
2  g  3  NA 4  5  4  Y
3  r  4  4  NA t  5  5')

df %>%
  mutate(across(everything(), ~replace_na(., 0)))
#>   a b c d e f g h
#> 1 1 0 0 2 3 4 7 6
#> 2 2 g 3 0 4 5 4 Y
#> 3 3 r 4 4 0 t 5 5

reprex package (v2.0.0)

于 2021-08-22 创建

知道 replace_na() 接受 replace 参数的命名列表,使用 purrr::map() 是减少代码量的好选择。也可以使用 'map2()'.

替换每列中的不同值

代码:

library(data.table)
library(tidyverse)

tbl <-read_table("a  b  c  d  e  f  g  d
1  NA NA 2  3  4  7  6
2  g  3  NA 4  5  4  Y
3  r  4  4  NA t  5  5")
#> Warning: Duplicated column names deduplicated: 'd' => 'd_1' [8]
nms <- c('b', 'c', 'e', 'f', 'g')

imap_dfc(tbl, ~ if(any(.y == nms)) replace_na(.x, 0) else .x) 
#> # A tibble: 3 × 8
#>       a b         c     d     e f         g d_1  
#>   <dbl> <chr> <dbl> <dbl> <dbl> <chr> <dbl> <chr>
#> 1     1 0         0     2     3 4         7 6    
#> 2     2 g         3    NA     4 5         4 Y    
#> 3     3 r         4     4     0 t         5 5
#using data.table

tblDT <- as.data.table(tbl)

#Further explanation here: 
tblDT[, (nms) := map(.SD, ~replace_na(., 0)), .SDcols = nms]

tblDT %>% 
  as_tibble()
#> # A tibble: 3 × 8
#>       a b         c     d     e f         g d_1  
#>   <dbl> <chr> <dbl> <dbl> <dbl> <chr> <dbl> <chr>
#> 1     1 0         0     2     3 4         7 6    
#> 2     2 g         3    NA     4 5         4 Y    
#> 3     3 r         4     4     0 t         5 5
#to replace na's in every column:

tbl %>%
  replace_na(map(., ~0))
#> # A tibble: 3 × 8
#>       a b         c     d     e f         g d_1  
#>   <dbl> <chr> <dbl> <dbl> <dbl> <chr> <dbl> <chr>
#> 1     1 0         0     2     3 4         7 6    
#> 2     2 g         3     0     4 5         4 Y    
#> 3     3 r         4     4     0 t         5 5

reprex package (v2.0.1)

于 2021-09-25 创建