Tengo un marco de datos llamado "mydata" que se ve así:
A B C D
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í:
A B C D
1. 5 4 4 4
3. 5 4 4 4
5. 5 4 4 4
7. 5 4 4 4
Respuestas:
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 llamamyData
:Por supuesto, no olvide "reasignar"
myData
si desea eliminar esas filas por completo, de lo contrario, R simplemente imprime los resultados.fuente
,
hay allí! ;)drop = FALSE
allí.-
, no funcionará, porque el operador complementario para lógica es!
. El complemento de c (2,4,6) en las filas preferiría establecerse (c (2,4,6), 1: nrow (myData)), que no es c (-2, -4, -6) , aunque ambos producirían las mismas filas cuando se usan con[
.myData[-c(2, 4, 6),,drop=F]
. De hecho, sugeriría que siempre inserte,drop=F
justo antes del]
acceso a cualquier matriz.También puede trabajar con un llamado vector booleano, también conocido como
logical
:Tenga en cuenta que el
!
operador actúa como un NOT, es decir!TRUE == FALSE
: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 el valor de una columna excede un cierto valor:
Puede transformar un vector booleano en un vector de índices:
Finalmente, un truco muy bueno es que puedes usar este tipo de subconjuntos no solo para la extracción, sino también para la asignación:
donde
A
se asigna la columnaNA
(no un número) dondeA
excede 4.fuente
Problemas con la eliminación 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 principal. Es decir,
Sin embargo, si está intentando escribir un script de análisis de datos robusto, 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, debe codificarse en una variable real en el data.frame.
Por ejemplo, imagine que importó un conjunto de datos y eliminó 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, ingresa a los datos sin procesar y echa un vistazo y reordena los datos. Su código de eliminación de filas ahora eliminará las filas incorrectas y, lo que es peor, es poco probable que reciba algún error que le advierta que esto ha ocurrido.
Mejor estrategia
Una mejor estrategia es eliminar filas basadas en propiedades sustantivas y estables de la fila. Por ejemplo, si tuviera una
id
variable de columna que identifique de forma única cada caso, podría usarla.Otras veces, 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.
fuente
Cree una columna de identificación en su marco de datos o use cualquier nombre de columna para identificar la fila. Usar el índice no es justo para eliminar.
Use la
subset
función para crear un nuevo marco.fuente
Por secuencia simplificada:
Por secuencia:
Por secuencia negativa:
O si desea subconjunto seleccionando números impares:
O si desea subconjunto seleccionando números impares, versión 2:
O si desea subconjuntos filtrando números pares:
O si desea subconjuntos filtrando números pares, versión 2:
fuente
Eliminar Dan de employee.data: no es necesario administrar un nuevo data.frame.
fuente
Aquí hay una función rápida y sucia para eliminar una fila por índice.
Su principal defecto es que el argumento row_index no sigue el patrón R de ser un vector de valores. Puede haber otros problemas, ya que solo pasé un par de minutos escribiéndolo y probándolo, y solo comencé a usar R en las últimas semanas. ¡Cualquier comentario y mejora en esto sería muy bienvenido!
fuente
Para completar, agregaré que esto se puede hacer también con el
dplyr
usoslice
. La ventaja de usar esto es que puede ser parte de un flujo de trabajo canalizado.Por supuesto, también puedes usarlo sin tuberías.
El formato "no vector"
-c(2, 4, 6)
significa obtener todo lo que no está en las filas 2, 4 y 6. Para un ejemplo que usa un rango, digamos que desea eliminar las primeras 5 filas, podría hacerloslice(df, 6:n())
. Para más ejemplos, vea los documentos .fuente