Filtrar data.frame linhas por uma condição lógica
Pergunta
Eu quero linhas de filtro de um data.frame
com base em uma condição lógica. Vamos supor que eu tenho quadro de dados como
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
O que eu quero é para obter um novo quadro de dados que tem a mesma aparência, mas só tem os dados para um cell_type. Por exemplo. subconjunto / seleccionar as linhas que contém o tipo de célula "hESC":
expr_value cell_type
1 5.929771 hesc
2 5.873096 hesc
3 5.665857 hesc
Ou um ou outro tipo de célula "bj fibroblastos" ou "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
Existe alguma maneira fácil de fazer isso?
Eu tentei:
expr[expr[2] == 'hesc']
# [1] "5.929771" "5.873096" "5.665857" "hesc" "hesc" "hesc"
Se o quadro de dados original é chamado de "expr", mas dá os resultados em formato errado, como você pode ver.
Solução
Para selecionar linhas de acordo com um 'cell_type' (por exemplo, 'hESC), uso ==
:
expr[expr$cell_type == "hesc", ]
Para seleccionar linhas de acordo com dois ou mais diferentes 'cell_type', (por exemplo, quer 'células estaminais embrionárias humanas' ou 'BJ do fibroblasto'), uso %in%
:
expr[expr$cell_type %in% c("hesc", "bj fibroblast"), ]
Outras dicas
Use subset
(para uso interativo)
subset(expr, cell_type == "hesc")
subset(expr, cell_type %in% c("bj fibroblast", "hesc"))
ou melhor dplyr::filter()
filter(expr, cell_type %in% c("bj fibroblast", "hesc"))
O expr[expr[2] == 'hesc']
razão não funciona é que para um quadro de dados, colunas x[y]
seleciona, não linhas. Se você quiser selecionar linhas, mude para o x[y,]
sintaxe em vez disso:
> expr[expr[2] == 'hesc',]
expr_value cell_type
4 5.929771 hesc
5 5.873096 hesc
6 5.665857 hesc
Você pode usar o pacote dplyr
:
library(dplyr)
filter(expr, cell_type == "hesc")
filter(expr, cell_type == "hesc" | cell_type == "bj fibroblast")
Às vezes, a coluna que deseja filtro pode aparecer em uma posição diferente do índice da coluna 2 ou ter um nome de variável.
Neste caso, você pode simplesmente encaminhar o nome da coluna você quer filtro como:
columnNameToFilter = "cell_type"
expr[expr[[columnNameToFilter]] == "hesc", ]
Eu estava trabalhando em uma trama de dados e não ter sorte com as respostas fornecidas, ele sempre retornou 0 linhas, então eu encontrei e grepl usados:
df = df[grepl("downlink",df$Transmit.direction),]
O que basicamente aparado minha trama de dados para somente as linhas que continham "downlink" na coluna da direção de transmissão. P. S. Se alguém pode adivinhar por que eu não estou vendo o comportamento esperado, por favor deixe um comentário.
Especificamente à pergunta inicial:
expr[grepl("hesc",expr$cell_type),]
expr[grepl("bj fibroblast|hesc",expr$cell_type),]
Ninguém parece ter incluído o qual a função. Ele também pode ser útil para filtrar.
expr[which(expr$cell == 'hesc'),]
Isso também irá lidar com AN e deixá-los a partir da trama de dados resultante.
A execução deste em um 9840 de 24 trama de dados de 50000 vezes, parece que o método que tem um tempo de 60% mais rápido correr do que o% no método%.
podemos usar a biblioteca data.table
library(data.table)
expr <- data.table(expr)
expr[cell_type == "hesc"]
expr[cell_type %in% c("hesc","fibroblast")]
ou filtro usando operador %like%
para correspondência de padrões
expr[cell_type %like% "hesc"|cell_type %like% "fibroblast"]