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

Ответ 1

Вы можете использовать функцию 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))

Ответ 2

Используйте 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),]

Ответ 3

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

library(tidyr)
DF %>% drop_na(y)
  x  y  z
1 1  0 NA
2 2 10 33

Ответ 4

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

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

Ответ 5

К настоящему времени можно просто использовать:

na.omit(data, cols = c("x", "z"))

Ответ 6

Попробуйте следующее:

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

Ответ 7

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

DF[!is.na(DF$x)&!is.na(DF$z),]

Ответ 8

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

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