2015-10-11 4 views
0

Я хочу заменить NA на 0 в 20 столбцах. Я нашел этот подход для 2 столбцов, однако, я думаю, это не оптимально, если количество столбцов равно 20. Есть ли альтернативное и более компактное решение?Как заменить NA на 0 в 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

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 
+0

после некоторых данных для тестирования. –

+1

Просто выполните 'cols <- c (" b "," c "," e "," f "); mydf [cols] <- replace (mydf [cols], is.na (mydf [cols]), 0) '. – A5C1D2H2I1M1N2O1R2T1

+0

У вас действительно есть две колонки 'd'? –

ответ

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 
+0

Но где определить имена столбцов, в которых NA должны быть заменены на 0? Мне не нужно заменять NA на 0 во всех столбцах. –

+1

type. Прости. ваше решение в порядке. Благодарю. –

2

Другой вариант:

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 
Смежные вопросы