Eliminar filas vacías de un archivo de datos en R

82

Tengo un conjunto de datos con filas vacías. Me gustaría eliminarlos:

myData<-myData[-which(apply(myData,1,function(x)all(is.na(x)))),]

Funciona bien. Pero ahora me gustaría agregar una columna en mis datos e inicializar el primer valor:

myData$newCol[1] <- -999

Error in `$<-.data.frame`(`*tmp*`, "newCol", value = -999) : 
  replacement has 1 rows, data has 0

Desafortunadamente, no funciona y realmente no entiendo por qué y no puedo resolver esto. Funcionó cuando eliminé una línea a la vez usando:

TgData = TgData[2:nrow(TgData),]

O algo similar.

También funciona cuando utilicé solo las primeras 13.000 filas.

Pero no funciona con mis datos reales, con 32.000 filas.

¿Qué hice mal? Me parece que no tiene sentido.

Antonin
fuente
posible duplicado de eliminar filas con NA en data.frame
Waldir Leoncio

Respuestas:

106

Supongo que desea eliminar filas que son todas NA. Luego, puede hacer lo siguiente:

data <- rbind(c(1,2,3), c(1, NA, 4), c(4,6,7), c(NA, NA, NA), c(4, 8, NA)) # sample data
data
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    1   NA    4
[3,]    4    6    7
[4,]   NA   NA   NA
[5,]    4    8   NA

data[rowSums(is.na(data)) != ncol(data),]
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    1   NA    4
[3,]    4    6    7
[4,]    4    8   NA

Si desea eliminar filas que tienen al menos un NA, simplemente cambie la condición:

data[rowSums(is.na(data)) == 0,]
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    6    7
Wookai
fuente
34
El segundo caso también se puede manejar a través de: data[complete.cases(data),].
Joshua Ulrich
@JoshuaUlrich ¡Gracias por su ayuda! ¿Solo por la comprensión? ¿Por qué dejas un ,al final de data[complete.cases(data),]tu código?
Anna.Klee
1
@mrquad, eso significa que está subconjunto por filas; consulte stackoverflow.com/a/17052459/2152245 .
Matt
56

Si tiene filas vacías, no NA, puede hacer:

data[!apply(data == "", 1, all),]

Para eliminar ambos (NA y vacío):

data <- data[!apply(is.na(data) | data == "", 1, all),]
Alex Nevsky
fuente
12

Aquí tienes algunas dplyropciones:

# sample data
df <- data.frame(a = c('1', NA, '3', NA), b = c('a', 'b', 'c', NA), c = c('e', 'f', 'g', NA))

library(dplyr)

# remove rows where all values are NA:
df %>% filter_all(any_vars(!is.na(.)))
df %>% filter_all(any_vars(complete.cases(.)))  


# remove rows where only some values are NA:
df %>% filter_all(all_vars(!is.na(.)))
df %>% filter_all(all_vars(complete.cases(.)))  

# or more succinctly:
df %>% filter(complete.cases(.))  
df %>% na.omit

# dplyr and tidyr:
library(tidyr)
df %>% drop_na
sbha
fuente
1
Ni na.omit () ni drop_na () devuelven filas que no son NA.
8

Solución alternativa para filas de NAs usando el janitorpaquete

myData %>% remove_empty("rows")
radek
fuente
1
Esta fue la solución más simple y funcionó para mí, ¡gracias!
2

Esto es similar a algunas de las respuestas anteriores, pero con esto, puede especificar si desea eliminar filas con un porcentaje de valores perdidos mayor o igual a un porcentaje dado (con el argumento pct)

drop_rows_all_na <- function(x, pct=1) x[!rowSums(is.na(x)) >= ncol(x)*pct,]

Dónde xes un marco de datos y pctes el umbral de NAdatos completados que desea eliminar

pct = 1significa eliminar filas que tienen el 100% de sus valores NA. pct = .5significa algunas filas que tienen al menos la mitad de sus valoresNA

Samantha Karlaina Rhoads
fuente
¿Cómo usar esta DIVERSIÓN en df?
Kshitij Manvelikar