Omitir linhas contendo coluna específica de NA


129

Quero saber como omitir NAvalores em um quadro de dados, mas apenas em algumas colunas em que estou interessado.

Por exemplo,

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

mas eu só quero omitir os dados onde yestá NA, portanto o resultado deve ser

  x  y  z
1 1  0 NA
2 2 10 33

na.omitparece excluir todas as linhas contêm qualquer NA.

Alguém pode me ajudar com essa pergunta simples?

Mas se agora eu mudar a pergunta como:

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

Se eu quiser omitir apenas x=naou z=na, onde posso colocar a |função in?

Respostas:


79

Você pode usar a complete.casesfunção e colocá-la em uma função assim:

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: retorna apenas linhas sem NAs

Se você deseja eliminar todas as linhas com pelo menos uma NAem qualquer coluna, basta usar a complete.casesfunção:

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

Ou se completeFunjá estiver enraizado no seu fluxo de trabalho;)

completeFun(DF, names(DF))

Você pode tornar sua abordagem gananciosa? Pegue todas as colunas que não possuem NAs.
Léo Léopold Hertz ·

1
Você quer dizer apenas retornar linhas sem NAs? Gosta completeFun(DF, names(DF))?
21717 BenBarnes

Corrigir! Por favor, considere adicioná-lo à sua resposta, porque é uma necessidade comum aqui. - Acho que a resposta de mnel não pode ser expandida como a sua. Sua abordagem de função é ótima!
Léo Léopold Hertz ·

1
Feito! Thx para a ponta @ LéoLéopoldHertz 준영
Ben Barnes

192

Usar 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),]

1
Como você aplica essa abordagem com avidez em todas as colunas no conjunto de dados? Se algum valor da coluna for NA, pule. Portanto, a saída do seu conjunto de dados é apenas a segunda coluna.
Léo Léopold Hertz · 18/07

2
Use na.omita avidamente remover todas as linhas com NA em qualquer colunana.omit(DF)
M. Viking

69

Hadley tidyracabou de receber essa função incríveldrop_na

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

30

Use 'subconjunto'

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

9

É possível usar na.omitpara data.table:

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

3
o cols=argumento está disponível na data.table::na.omitbiblioteca. Não é a base stats::na.omit.
M. Viking

3

Tente o seguinte:

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

2

Omita a linha se uma das duas colunas específicas contiver <NA>.

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

1

Apenas tente o seguinte:

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

Ele transpõe o quadro de dados e omite linhas nulas que eram 'colunas' antes da transposição e, em seguida, você o transpõe.


8
Por favor, explique um pouco o que está acontecendo.
vonbrand
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.