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:
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
fuente
data[complete.cases(data),]
.,
al final dedata[complete.cases(data),]
tu código?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),]
fuente
Aquí tienes algunas
dplyr
opciones:# 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
fuente
Solución alternativa para filas de
NA
s usando eljanitor
paquetemyData %>% remove_empty("rows")
fuente
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
x
es un marco de datos ypct
es el umbral deNA
datos completados que desea eliminarpct = 1
significa eliminar filas que tienen el 100% de sus valoresNA
.pct = .5
significa algunas filas que tienen al menos la mitad de sus valoresNA
fuente