2012-06-29 2 views
70

Я хочу знать, как опустить NA значения в кадре данных, но только в некоторых колонках я заинтересован.Опустить строки, содержащие конкретный столбец NA

Например,

DF <- data.frame(x = c(1, 2, 3), y = c(0, 10, NA), z=c(NA, 33, 22)) 

но я только хочу, чтобы пропустить данные, где y является NA, поэтому результат должен быть

x y z 
1 1 0 NA 
2 2 10 33 

na.omit кажется удалить все строки жулик tain any NA.

Может ли кто-нибудь помочь мне решить этот простой вопрос?

Но если теперь я изменить вопрос, как:

DF <- data.frame(x = c(1, 2, 3,NA), y = c(1,0, 10, NA), z=c(43,NA, 33, NA)) 

Если я хочу, чтобы пропустить только x=na или z=na, где я могу поставить | в функции?

ответ

44

Вы можете использовать функцию complete.cases и положить его в функцию таким образом:

DF <- data.frame(x = c(1, 2, 3), y = c(0, 10, NA), z=c(NA, 33, 22)) 

completeFun <- function(data, desiredCols) { 
    completeVec <- complete.cases(data[, desiredCols]) 
    return(data[completeVec, ]) 
} 

completeFun(DF, "y") 
# x y z 
# 1 1 0 NA 
# 2 2 10 33 

completeFun(DF, c("y", "z")) 
# x y z 
# 2 2 10 33 

EDIT:Только возвращать строки с нет NA s

Если вы хотите, чтобы удалить все строки, по крайней мере, один NA в любом столбце, просто используйте complete.cases функцию прямо вверх:

DF[complete.cases(DF), ] 
# x y z 
# 2 2 10 33 

Или, если completeFun уже укоренилась в ваш рабочий;)

completeFun(DF, names(DF)) 
+0

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

+1

Вы имеете в виду просто вернуть * rows * без 'NA'? Как 'completeFun (DF, names (DF))'? – BenBarnes

+0

Правильно! Пожалуйста, подумайте над тем, чтобы добавить его к вашему ответу, потому что здесь общая потребность. - Я думаю, что ответ Мнне не может быть расширен как ваш. Ваш функциональный подход замечательный! –

133

Использование is.na

DF <- data.frame(x = c(1, 2, 3), y = c(0, 10, NA), z=c(NA, 33, 22)) 
DF[!is.na(DF$y),] 
+0

Как применить этот подход жадностью на все столбцы в наборе данных? Если какое-либо значение столбца имеет значение NA, пропустите. Таким образом, ваш вывод набора данных является вторым столбцом. –

3

Попробуйте это:

cc=is.na(DF$y) 
m=which(cc==c("TRUE")) 
DF=DF[-m,] 
20

используйте 'подмножество'

DF <- data.frame(x = c(1, 2, 3), y = c(0, 10, NA), z=c(NA, 33, 22)) 
subset(DF, !is.na(y)) 
19

Хедли tidyr только что получил эту удивительную функцию drop_na

library(tidyr) 
DF %>% drop_na(y) 
    x y z 
1 1 0 NA 
2 2 10 33 
Смежные вопросы