我想在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
中的NAa 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
答案 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, "")