2009-11-06 20 views
94

Quiero filtrar filas de un data.frame según una condición lógica. Supongamos que tengo trama de datos comoFiltrar filas data.frame por una condición lógica

expr_value  cell_type 
1 5.345618 bj fibroblast 
2 5.195871 bj fibroblast 
3 5.247274 bj fibroblast 
4 5.929771   hesc 
5 5.873096   hesc 
6 5.665857   hesc 
7 6.791656   hips 
8 7.133673   hips 
9 7.574058   hips 
10 7.208041   hips 
11 7.402100   hips 
12 7.167792   hips 
13 7.156971   hips 
14 7.197543   hips 
15 7.035404   hips 
16 7.269474   hips 
17 6.715059   hips 
18 7.434339   hips 
19 6.997586   hips 
20 7.619770   hips 
21 7.490749   hips 

Lo que quiero es conseguir una nueva trama de datos, que tiene el mismo aspecto, pero sólo tiene los datos para un cell_type. P.ej. subconjunto/selectas filas que contiene el tipo de célula "HESC":

expr_value  cell_type 
1 5.929771   hesc 
2 5.873096   hesc 
3 5.665857   hesc 

O cualquiera de los tipos de células "de fibroblastos BJ" o "HESC":

expr_value  cell_type 
1 5.345618 bj fibroblast 
2 5.195871 bj fibroblast 
3 5.247274 bj fibroblast 
4 5.929771   hesc 
5 5.873096   hesc 
6 5.665857   hesc 

¿Hay alguna forma fácil de hacer esto?

He intentado:

expr[expr[2] == 'hesc'] 
# [1] "5.929771" "5.873096" "5.665857" "hesc"  "hesc"  "hesc"  

si la trama de datos original se llama "expr", pero da los resultados en un formato incorrecto como se puede ver.

Respuesta

134
expr[expr$cell_type == "hesc", ] 

expr[expr$cell_type %in% c("hesc", "bj fibroblast"), ] 
+19

Tenga en cuenta que el '' == función será recoger cualquier NA registra, así como "HESC" , mientras que '% en%' no. –

+1

@Matt cuando se usa 'subconjunto' esto funciona como se esperaba. –

70

Uso subset (para uso interactivo)

subset(expr, cell_type == "hesc") 
subset(expr, cell_type %in% c("bj fibroblast", "hesc")) 

o mejor dplyr::filter()

filter(expr, cell_type %in% c("bj fibroblast", "hesc")) 
+28

¡Cuidado! La documentación de 'subconjunto' tiene una gran ADVERTENCIA:" Esta es una función de conveniencia destinada para su uso de forma interactiva. Para la programación es mejor utilizar las funciones de subconjunto estándar como [, y en particular el evaluación no estándar del argumento * subconjunto * puede haber consecuencias imprevistas ces. " –

27

La razón expr[expr[2] == 'hesc'] no funciona es que para una trama de datos, x[y] selecciona columnas, no filas Si desea seleccionar filas, cambiar a la sintaxis x[y,] lugar:

> expr[expr[2] == 'hesc',] 
    expr_value cell_type 
4 5.929771  hesc 
5 5.873096  hesc 
6 5.665857  hesc 
15

podría utilizar el dplyr paquete:

library(dplyr) 
filter(expr, cell_type == "hesc") 
filter(expr, cell_type == "hesc" | cell_type == "bj fibroblast") 
2

veces la columna que desea filtrar pueden aparecer en una posición diferente a la columna índice 2 o tiene un nombre de variable.

En este caso, sólo tiene que remitir el nombre de la columna desea filtrar como:

columnNameToFilter = "cell_type" 
expr[expr[[columnNameToFilter]] == "hesc", ] 
Cuestiones relacionadas