Tengo un gran marco de datos del que necesito eliminar filas que no contienen ningún valor presente en un vector (nombre de vector "códigos").

Marco de datos de ejemplo:

df <- data.frame(ID = as.integer(c(10001, 10002, 10004, 10005, 10006)), 
                 X1 = as.integer(c(150, 120, 175, 160, 1)),
                 X2 = as.integer(c(1, 1412415, 16420, 19920, 150)))
> df
     ID  X1      X2
1 10001 150       1
2 10002 120 1412415
3 10003 175   16420
4 10004 160   19920
5 10005   1     150

codes <- c(120, 150)
codes <- as.integer(codes)

He probado varias opciones, aquí hay un ejemplo fallido:

newdf <- df[do.call(paste, df[2:3]) %in% codes,]

> newdf
[1] ID X1 X2
<0 rows> (or 0-length row.names)

En cambio, newdf debe contener las filas 1, 2 y 5 con los números de identificación 10001, 10002 y 10005 como tales:

> newdf
     ID  X1      X2
1 10001 150       1
2 10002 120 1412415
5 10005   1     150
r
2
maxxzi 24 abr. 2020 a las 14:40

2 respuestas

La mejor respuesta

Esta manera es agradable, ya que es escalable a cualquier número de columnas que comiencen con X.

dplyr::filter_at(df, vars(starts_with("X")), any_vars(. %in% codes))
2
sahwahn 24 abr. 2020 a las 11:53

dplyr::filter() hace lo que quieres. Toma cualquier condición (como es la parte del valor del vector X) y elimina todas las filas que no coinciden con las condiciones:

library(dplyr)

df %>%
filter(X1 %in% codes | X2 %in% codes)
0
Fnguyen 24 abr. 2020 a las 11:45