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

时间:2015-10-11 16:46:55

标签: 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)})

更新: 为简单起见,我们将这些数据用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

4 个答案:

答案 0 :(得分:7)

来自replace_na的{​​{1}}函数可应用于向量和数据框(http://tidyr.tidyverse.org/reference/replace_na.html)。

将其与tidyr的{​​{1}}变体一起使用,同时将其应用于多个列:

mutate_at

dplyr

答案 1 :(得分:3)

我们可以使用NAer中的qdap将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

答案 2 :(得分:3)

另一种选择:

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

答案 3 :(得分:2)

这是一种tidyverse方式,可根据列的数据类型用不同的值替换NA。

library(tidyverse)

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