Пропускать строки, содержащие определенный столбец NA

131

Я хочу знать, как опускать 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кажется удалить все строки, содержащие какие-либо 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, где я могу вставить |функцию?

user1489975
источник

Ответы:

80

Вы можете использовать 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

РЕДАКТИРОВАТЬ: возвращать только строки без NAs

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

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

Или если completeFunэто уже укоренилось в вашем рабочем процессе;)

completeFun(DF, names(DF))
Бен Барнс
источник
Можете ли вы сделать свой подход жадным? Возьмите все столбцы, у которых вообще нет NA.
Лео Леопольд Герц 준영
1
Вы имеете в виду просто возвращать строки без NAs? Нравится completeFun(DF, names(DF))?
BenBarnes
Верный! Пожалуйста, подумайте о добавлении его к своему ответу, потому что здесь это обычная необходимость. - Думаю, ответ мнел не может быть расширен, как ваш. Ваш функциональный подход великолепен!
Лео Леопольд Герц 준영
1
Готово! Спасибо за подсказку @ LéoLéopoldHertz 준영
BenBarnes
193

использование 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),]
mnel
источник
1
Как вы с жадностью примените этот подход ко всем столбцам в наборе данных? Если любое из значений столбца - NA, пропустить. Таким образом, вывод вашего набора данных - это только второй столбец.
Лео Леопольд Герц 준영
2
Используйте na.omitдля жадного удаления всех строк с NA в любом столбцеna.omit(DF)
M. Viking
70

У Хэдли tidyrпросто потрясающая функцияdrop_na

library(tidyr)
DF %>% drop_na(y)
  x  y  z
1 1  0 NA
2 2 10 33
amrrs
источник
31

Используйте "подмножество"

DF <- data.frame(x = c(1, 2, 3), y = c(0, 10, NA), z=c(NA, 33, 22))
subset(DF, !is.na(y))
Rnoob
источник
11

Можно использовать na.omitдля data.table:

na.omit(data, cols = c("x", "z"))
гулкими
источник
3
cols=аргумент доступен в data.table::na.omitбиблиотеке. Не база stats::na.omit.
М. Викинг
3

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

cc=is.na(DF$y)
m=which(cc==c("TRUE"))
DF=DF[-m,]
rockswap
источник
2

Пропускайте строку, если один из двух конкретных столбцов содержит <NA>.

DF[!is.na(DF$x)&!is.na(DF$z),]
М. Викинг
источник
1

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

DF %>% t %>% na.omit %>% t

Он перемещает фрейм данных и пропускает пустые строки, которые были «столбцами» до транспонирования, а затем вы переносите его обратно.

Леон Ци
источник
9
Пожалуйста, объясните немного, что происходит.
vonbrand