varias superponer studio name lineas graficos graficas delete data columns column r dataframe rows

studio - superponer graficas en r



Eliminar filas específicas de un marco de datos (4)

Aquí hay una solución a su problema usando la función de filter dplyr .

Aunque puede pasar su marco de datos como primer argumento a cualquier función dplyr, he usado su operador %>% , que canaliza su marco de datos a una o más funciones dplyr (solo filtre en este caso).

Una vez que esté familiarizado con dplyr, la hoja de trucos es muy útil.

> print(df <- data.frame(sub=rep(1:3, each=4), day=1:4)) sub day 1 1 1 2 1 2 3 1 3 4 1 4 5 2 1 6 2 2 7 2 3 8 2 4 9 3 1 10 3 2 11 3 3 12 3 4 > print(df <- df %>% filter(!((sub==1 & day==2) | (sub==3 & day==4)))) sub day 1 1 1 2 1 3 3 1 4 4 2 1 5 2 2 6 2 3 7 2 4 8 3 1 9 3 2 10 3 3

Tengo un marco de datos, por ejemplo:

sub day 1 1 1 2 1 3 1 4 2 1 2 2 2 3 2 4 3 1 3 2 3 3 3 4

y me gustaría eliminar filas específicas que pueden ser identificadas por la combinación de sub y día. Por ejemplo, digamos que quería eliminar las filas donde sub = ''1'' y día = ''2'' y sub = 3 y día = ''4''. ¿Cómo podría hacer esto? Me doy cuenta de que podría especificar los números de fila, pero esto debe aplicarse a un gran marco de datos que sería tedioso pasar e identificar cada fila.


Esto se reduce a dos pasos distintos:

  1. Averigüe cuándo su condición es verdadera y, por lo tanto, calcule un vector de valores booleanos o, según prefiera, sus índices, envolviéndolos en los which()
  2. Cree un data.frame actualizado excluyendo los índices del paso anterior.

Aquí hay un ejemplo:

R> set.seed(42) R> DF <- data.frame(sub=rep(1:4, each=4), day=sample(1:4, 16, replace=TRUE)) R> DF sub day 1 1 4 2 1 4 3 1 2 4 1 4 5 2 3 6 2 3 7 2 3 8 2 1 9 3 3 10 3 3 11 3 2 12 3 3 13 4 4 14 4 2 15 4 2 16 4 4 R> ind <- which(with( DF, sub==2 & day==3 )) R> ind [1] 5 6 7 R> DF <- DF[ -ind, ] R> table(DF) day sub 1 2 3 4 1 0 1 0 3 2 1 0 0 0 3 0 1 3 0 4 0 2 0 2 R>

Y vemos que sub==2 solo le queda una entrada con el day==1 .

Editar La condición compuesta se puede hacer con un ''o'' como sigue:

ind <- which(with( DF, (sub==1 & day==2) | (sub=3 & day=4) ))

Y aquí hay un nuevo ejemplo completo.

R> set.seed(1) R> DF <- data.frame(sub=rep(1:4, each=5), day=sample(1:4, 20, replace=TRUE)) R> table(DF) day sub 1 2 3 4 1 1 2 1 1 2 1 0 2 2 3 2 1 1 1 4 0 2 1 2 R> ind <- which(with( DF, (sub==1 & day==2) | (sub==3 & day==4) )) R> ind [1] 1 2 15 R> DF <- DF[-ind, ] R> table(DF) day sub 1 2 3 4 1 1 0 1 1 2 1 0 2 2 3 2 1 1 0 4 0 2 1 2 R>


una solución simple

cond1 <- df$sub == 1 & df$day == 2

cond2 <- df$sub == 3 & df$day == 4

df <- df[!cond1,]

df <- df[!cond2,]


DF[ ! ( ( DF$sub ==1 & DF$day==2) | ( DF$sub ==3 & DF$day==4) ) , ] # note the ! (negation)

O si sub es un factor como lo sugiere su uso de citas:

DF[ ! paste(sub,day,sep="_") %in% c("1_2", "3_4"), ]

También podría usar subconjunto:

subset(DF, ! paste(sub,day,sep="_") %in% c("1_2", "3_4") )

(Y endoso el uso de lo which en la respuesta de Dirk cuando se usa "[", aunque algunos afirman que no es necesario).