¿Cómo elimino las filas en un dataframe?

Tengo un dataframe llamado “mydata” que se ve así:

ABCD 1. 5 4 4 4 2. 5 4 4 4 3. 5 4 4 4 4. 5 4 4 4 5. 5 4 4 4 6. 5 4 4 4 7. 5 4 4 4 

Me gustaría eliminar la fila 2,4,6. Por ejemplo, así:

  ABCD 1. 5 4 4 4 3. 5 4 4 4 5. 5 4 4 4 7. 5 4 4 4 

La idea clave es formar un conjunto de las filas que desea eliminar, y mantener el complemento de ese conjunto.

En R, el complemento de un conjunto viene dado por el operador ‘-‘.

Entonces, suponiendo que data.frame se llama myData :

 myData[-c(2, 4, 6), ] # notice the - 

Por supuesto, no te olvides de “reasignar” myData si deseas soltar esas filas por completo; de lo contrario, R solo imprime los resultados.

 myData <- myData[-c(2, 4, 6), ] 

También puede trabajar con un llamado vector booleano, también conocido como logical :

 row_to_keep = c(TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE) myData = myData[row_to_keep,] 

Tenga en cuenta que el ! el operador actúa como NOT, es decir !TRUE == FALSE :

 myData = myData[!row_to_keep,] 

Esto parece un poco engorroso en comparación con la respuesta de @ mrwab (+1 por cierto :)), pero se puede generar un vector lógico sobre la marcha, por ejemplo, cuando un valor de columna excede un cierto valor:

 myData = myData[myData$A > 4,] myData = myData[!myData$A > 4,] # equal to myData[myData$A <= 4,] 

Puede transformar un vector booleano en un vector de índices:

 row_to_keep = which(myData$A > 4) 

Finalmente, un truco muy ingenioso es que puede usar este tipo de subconjunto no solo para la extracción, sino también para la asignación:

 myData$A[myData$A > 4,] <- NA 

donde a la columna A se le asigna NA (no un número) donde A excede a 4.

Problemas con eliminar por número de fila

Para análisis rápidos y sucios, puede eliminar filas de un data.frame por número según la respuesta superior. Es decir,

 newdata <- myData[-c(2, 4, 6), ] 

Sin embargo, si intenta escribir una secuencia de comandos robusta de análisis de datos, generalmente debe evitar eliminar filas por posición numérica. Esto se debe a que el orden de las filas en sus datos puede cambiar en el futuro. Un principio general de un data.frame o tablas de base de datos es que el orden de las filas no debería importar. Si el orden es importante, esto debe codificarse en una variable real en data.frame.

Por ejemplo, imagine que importó un conjunto de datos y borró filas por posición numérica después de inspeccionar los datos e identificar los números de fila de las filas que desea eliminar. Sin embargo, en algún momento posterior, ingresas a los datos brutos, echas un vistazo y reordenas los datos. El código de eliminación de filas ahora eliminará las filas incorrectas y, lo que es peor, es poco probable que reciba ningún error que le advierta que esto ha ocurrido.

Mejor estrategia

Una mejor estrategia es eliminar filas en función de las propiedades sustantivas y estables de la fila. Por ejemplo, si tiene una variable de columna de identificación que identifica de manera única cada caso, puede usar eso.

 newdata <- myData[ !(myData$id %in% c(2,4,6)), ] 

En otras ocasiones, tendrá un criterio de exclusión formal que podría especificarse, y podría usar una de las muchas herramientas de subconjunto en R para excluir casos basados ​​en esa regla.

Cree una columna de identificación en su dataframe o use cualquier nombre de columna para identificar la fila. No es justo borrar el uso del índice.

Use la función subset para crear un nuevo marco.

 updated_myData <- subset(myData, id!= 6) print (updated_myData) updated_myData <- subset(myData, id %in% c(1, 3, 5, 7)) print (updated_myData) 

Por secuencia simplificada:

 mydata[-(1:3 * 2), ] 

Por secuencia:

 mydata[seq(1, nrow(mydata), by = 2) , ] 

Por secuencia negativa:

 mydata[-seq(2, nrow(mydata), by = 2) , ] 

O si desea subconjunto seleccionando números impares:

 mydata[which(1:nrow(mydata) %% 2 == 1) , ] 

O si desea subconjuntos seleccionando números impares, versión 2:

 mydata[which(1:nrow(mydata) %% 2 != 0) , ] 

O si desea subconjuntos filtrando los números pares:

 mydata[!which(1:nrow(mydata) %% 2 == 0) , ] 

O si quiere subconjuntar filtrando números pares, versión 2:

 mydata[!which(1:nrow(mydata) %% 2 != 1) , ]