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.


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

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

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

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")

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


¿Cómo usar esta DIVERSIÓN en df?
Kshitij Manvelikar
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.