Filtrar un marco de datos

12

¿Sigue aprendiendo funciones básicas en R? ¿La función de subconjunto parece filtrar solo una condición basada en una sola columna con o sin múltiples condiciones?

¿Cómo puedo filtrar fácilmente los datos de un marco de datos?

  1. cuando se le proporcionan múltiples condiciones

  2. Cuando la condición debe aplicarse en las columnas disponibles.

Ejemplo: dado un marco de datos que contiene

name    D1      D2     D3      D4
julius  "A"     "A"    "B"     "B"
cate    "D"     "E"     "A"     "C"
karo    "A"     "D"     "C"     "E"

digamos que quiero filtrar este marco de datos para que solo los nombres donde cualquiera de los D1 a D4 sea una 'E', entonces debería tener,

name    D1      D2     D3      D4
cate    "D"     "E"     "A"     "C"
karo    "A"     "D"     "C"     "E"

Digamos que el D1 puede ser una gran lista de columnas, ¿cómo o cuál es el enfoque recomendado para realizar este filtro? Gracias

eastafri
fuente

Respuestas:

26

Si desea combinar varios filtros en la función de subconjunto , utilice operadores lógicos:

 subset(data, D1 == "E" | D2 == "E")

seleccionará aquellas filas para las cuales la columna D1 o la columna D2 tienen el valor "E". Mire las páginas de ayuda para los operadores lógicos disponibles:

 > ?"|"

Para su segunda pregunta, lo que necesita es filtrar las filas. Esto se puede lograr de la siguiente manera

 collist <- c("D1","D2","D3","D4")
 sel <- apply(data[,collist],1,function(row) "E" %in% row)
 data[sel,]

El primer argumento para aplicar suministra las columnas en las que necesitamos filtrar. El segundo argumento es 1, lo que significa que estamos recorriendo filas de datos. El tercer argumento es una función de una línea sin nombre que devuelve VERDADERO si "E" está presente en la fila y FALSO si la "E" no está presente.

El resultado de la función de aplicación será el vector lógico sel , que tiene la misma longitud que el número de filas en los datos. Luego usamos este vector para seleccionar las filas necesarias.

Actualizar

Lo mismo se puede lograr con grep:

sel <- apply(data[,collist],1,function(row) length(grep("E",row))>0)

en R grep con argumentos predeterminados devuelve el número de elementos en el vector suministrado que tienen el patrón correspondiente.

mpiktas
fuente
2
Otra función útil es any. Por ejemplo, si desea comprobar que al menos un elemento de un vector es = 10podría escribir ( any(v==10)).
nico
@nico sí, pero el 10% en% v tiene 9 caracteres y una variante con cualquier 10 :). Aunque para los vectores numéricos es mejor usar la igualdad, ya que R es inteligente y si sus datos son enteros mezclados con números reales, reconocerá correctamente que tiene 10 en su conjunto de datos.
mpiktas
¿Qué pasa con el caso de la expresión regular? asumiendo que no quieres trabajar con una coincidencia exacta? ¿Tienen algo parecido a ~ = como en otros idiomas? lo que está más cerca de esa expresión en R
eastafri
@Biorelated Consulte grepy agrep, y documentación relacionada en POSIX 1003.2 o expresiones regulares compatibles con Perl.
chl
@Biorelated, he actualizado la respuesta con el ejemplo de grep.
mpiktas