2011-08-25 25 views
5

Tengo un gran conjunto de datos con 11 columnas y 100000 filas (por ejemplo) en las que tengo valores 1,2,3,4. Donde 4 es un valor faltante. Algunas de las filas faltan por completo. es decir, 4 en las 11 columnas. Por ejemplo¿Cómo eliminar una fila que contiene solo valores faltantes en R?

"4" "4" "4" "4" "4" "4" "4" "4" "4" "4" "4" 

Ahora lo que necesito es eliminar solo aquellas filas que faltan por completo. En palabras simples, quiero mantener las filas con un valor perdido menor que 11. He usado na.omit, pero no funciona en mi caso.

Gracias de antemano.

+0

¿Cómo se hace esto probablemente dependerá de la información que no se ha proporcionado. ¿Es esto un marco de datos o una matriz? ¿Los valores están almacenados como enteros o caracteres? Intenta editar tu pregunta con la salida de ejecutar 'str (head (foo))' donde 'foo' es tu información. – joran

Respuesta

2

Una forma muy rápida sería usar un poco de matemática. Asumiendo que su trama de datos se llama DATF

rsum <- rowSums(datf) 
datf <- datf[rowSums != 44,] #11 * 4 

(trabaja para una matriz también)

+2

No le daré un menos 1, pero este tipo de enfoque es muy peligroso. Funciona para este caso específico, pero ¿qué ocurre si agrega/elimina una columna? Siempre intente y resuelva los problemas de manera robusta. – Andrie

+1

Esto no funcionará porque una fila puede sumar 44 sin que todos los elementos sean 4 (por ejemplo, 'c (4,4,4,4,4,4,4,4,4,3,5)'). –

+0

nota pregunta ... los valores solo pueden ser 1, 2, 3 o 4 en este conjunto de datos. – John

1

Algo como esto debe hacer el truco (y debería funcionar para ambas matrices y data.frames):

ac<-matrix(c("4","4","4","4","4","4","4","3","3","4","4", rep("4", 11)), nrow=2, ncol=11, byrow=TRUE) 

rowsToRemove<-which(apply(ac, 1, function(currow){ 
    all(currow=="4") 
})) 

Ahora se puede hacer simplemente

newac<-ac[-rowsToRemove,] 
11

Tal vez su mejor opción es utilizar Lenguaje de R para trabajar con valores faltantes o NA. Una vez que haya codificado NA valores, puede trabajar con complete.cases para lograr su objetivo fácilmente.

Cree algunos datos de la muestra con valores perdidos (es decir, con valor de 4):

set.seed(123) 
m <- matrix(sample(1:4, 30, prob=c(0.3, 0.3, 0.3, 0.1), replace=TRUE), ncol=6) 
m[4, ] <- rep(4, 6) 

Reemplazar todos los valores iguales a 4 con NA:

m[m==4] <- NA 
m 
    [,1] [,2] [,3] [,4] [,5] [,6] 
[1,] 1 1 NA 2 2 2 
[2,] 2 3 3 1 2 3 
[3,] 3 2 2 1 2 3 
[4,] NA NA NA NA NA NA 
[5,] NA 3 1 NA 2 1 

Ahora puede utilizar una variedad de funciones que tratar con NA valores. Por ejemplo, complete.cases solo se obtendrán, lo has adivinado, casos completos:

m[complete.cases(m), ] 

    [,1] [,2] [,3] [,4] [,5] [,6] 
[1,] 2 3 3 1 2 3 
[2,] 3 2 2 1 2 3 

Para obtener más información, consulte ?complete.cases o ?na.fail en el paquete stats.

+0

Esto no es lo que se solicita. El OP desea eliminar solo las filas que faltan por completo. – Kenji

2

Ésta es la solución más rápida que puedo pensar. Usaré datos de ejemplo similares a @Andrie.

set.seed(21) 
m <- matrix(sample(1:6, 110, replace=TRUE), ncol=11) 
missVal <- 4 
m[4, ] <- rep(missVal, 11) 
m <- m[ rowSums((m==missVal)) != NCOL(m), ] 

La última línea funciona porque m==missVal devuelve una matriz de valores lógicos (TRUE/FALSE). rowSums convierte TRUE a 1 y FALSE a 0, por lo que en este caso sabemos todas las columnas son 4 siempre rowSums retornos 11.

2

encontré esta solución en otro lugar y estoy pegando aquí utilizando el código de Andrie para generar el conjunto de datos inicial.

Primera generar el conjunto de datos:

set.seed(123) 
m <- matrix(sample(1:4, 30, prob=c(0.3, 0.3, 0.3, 0.1), replace=TRUE), ncol=6) 
m[4, ] <- rep(4, 6) 
m[m==4] <- NA 
m 

Éste es el conjunto de datos intial:

1 1 NA 2 2 2 
2 3 3 1 2 3 
3 2 2 1 2 3 
NA NA NA NA NA NA 
NA 3 1 NA 2 1 

Ahora eliminar filas que sólo contienen observaciones faltantes:

m[rowSums(is.na(m))<ncol(m),] 

Aquí está el resultado:

1 1 NA 2 2 2 
2 3 3 1 2 3 
3 2 2 1 2 3 
NA 3 1 NA 2 1 
2

Utilizando data.table para la eficiencia de la memoria. La solución que crea is.na(x) está creando un conjunto de datos tan grande como el original y, por lo tanto, es ineficiente.

library(data.table) 
DT <- as.data.table(m) 
missing_value <- 4 
missing <- as.data.table(setNames(as.list(rep(4, length(DT)), names(DT)) 
setkeyv(DT, names(DT)) 
setkey(missing, names(DT)) 

DT[-DT[(missing),which=T]] 

tanto esto como la solución de @ JoshuaUlrich son rápidos de datos de gran tamaño

set.seed(21) 
m <- matrix(sample(1:6, 1100000, replace=TRUE), ncol=11) 
missVal <- 4 
missing_rows <- sample(100000, 53) 
m[missing_rows, ] <- rep(missVal, 11) 

DT <- as.data.table(m) 
setkeyv(DT, names(DT)) 
missing <- setNames(as.list(rep(missVal, 11)), names(DT)) 

system.time({DT1 <- DT[-DT[missing,which=T]]}) 
## user system elapsed 
## 0.02 0.00 0.01 
system.time({m1 <- m[ rowSums((m==missVal)) != NCOL(m), ]}) 
## user system elapsed 
## 0.02 0.02 0.03 
+1

Tenga cuidado con 'T' /' F' en lugar de 'TRUE' /' FALSE', ya que 'T' y' F' pueden redefinirse. –

Cuestiones relacionadas