如何在20列中用0代替NA?

Kla*_*sos 4 r na

我想用20列中的0代替NA。我发现这种方法适用于2列,但是如果列数为20,我认为这不是最佳选择。是否有其他替代方法和更紧凑的解决方案?

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

更新:为简单起见,让我们用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
Run Code Online (Sandbox Code Playgroud)

结果必须是这样的:

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
Run Code Online (Sandbox Code Playgroud)

Fen*_*Mai 9

下面是tidyverse根据列的数据类型将 NA 替换为不同值的方法。

library(tidyverse)

dataset %>% mutate_if(is.numeric, replace_na, 0) %>%  
    mutate_if(is.character, replace_na, "")
Run Code Online (Sandbox Code Playgroud)


小智 8

replace_nafrom 的功能tidyr可以应用于矢量以及数据框(http://tidyr.tidyverse.org/reference/replace_na.html)。

与使用它mutate_at的变化,从dplyr在同一时间将其应用到多个列:

my_data %>% mutate_at(vars(b,c,e,f), replace_na, 0)
Run Code Online (Sandbox Code Playgroud)

要么

my_data %>% mutate_at(c('b','c','e','f'), replace_na, 0)
Run Code Online (Sandbox Code Playgroud)


Ani*_*yal 6

另一种策略使用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
Run Code Online (Sandbox Code Playgroud)

由reprex 包于 2021 年 8 月 22 日创建(v2.0.0)


Ste*_*pré 5

Another option:

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

Which gives:

#  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
Run Code Online (Sandbox Code Playgroud)


akr*_*run 4

我们可以使用NAerfromqdap将 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
Run Code Online (Sandbox Code Playgroud)

或者使用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
Run Code Online (Sandbox Code Playgroud)