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.

Foi útil?

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"]
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top