Domanda

Voglio filtrare le righe da una data.frame sulla base di una condizione logica. Supponiamo che io ho cornice di dati come

   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

Quello che voglio è quello di ottenere una nuova cornice di dati che sembra lo stesso, ma ha solo i dati per un cell_type. Per esempio. sottoinsieme / select righe che contiene il tipo di cellula "hESC":

   expr_value     cell_type
1    5.929771          hesc
2    5.873096          hesc
3    5.665857          hesc

O entrambi i tipi di cellule "BJ fibroblasti" 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

C'è un modo semplice per fare questo?

Ho provato:

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

se il frame di dati originale è chiamato "expr", ma dà i risultati in formato sbagliato, come si può vedere.

È stato utile?

Soluzione

Per selezionare righe secondo una 'cell_type' (per esempio 'hESC'), uso ==:

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

Per selezionare righe secondo due o più differenti 'cell_type', (ad esempio sia 'hESC' o 'bj fibroblasti'), uso %in%:

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

Altri suggerimenti

Usa subset (per l'uso interattivo)

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

o meglio dplyr::filter()

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

Il motivo expr[expr[2] == 'hesc'] non funziona è che per un frame di dati, x[y] seleziona colonne, non righe. Se si desidera selezionare le righe, passare alla x[y,] sintassi invece:

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

È possibile utilizzare il pacchetto dplyr:

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

A volte la colonna che si desidera filtrare può apparire in una posizione diversa rispetto indice della colonna 2 o hanno un nome di variabile.

In questo caso, si può semplicemente fare riferimento alla nome della colonna si desidera filtrare come:

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

stavo lavorando su un dataframe e non avendo fortuna con le risposte fornite, sempre restituito 0 righe, così ho trovato e usato Grepl:

df = df[grepl("downlink",df$Transmit.direction),]

Che sostanzialmente tagliato il mio dataframe al solo le righe che contenevano "downlink" nella colonna direzione di trasmissione. Post scriptum Se qualcuno può immaginare il motivo per cui io non sto vedendo il comportamento previsto, si prega di lasciare un commento.

In particolare alla domanda iniziale:

expr[grepl("hesc",expr$cell_type),]

expr[grepl("bj fibroblast|hesc",expr$cell_type),]

Nessuno sembra aver incluso la quale funzione. Può anche essere utile per il filtraggio.

expr[which(expr$cell == 'hesc'),]

Questo sarà anche gestire AN e rilasciarli dal dataframe risultante.

L'esecuzione di questo su un 9840 da 24 dataframe 50000 volte, sembra che il metodo che ha un tempo di esecuzione del 60% più veloce rispetto al% nel metodo%.

possiamo usare biblioteca data.table

  library(data.table)
  expr <- data.table(expr)
  expr[cell_type == "hesc"]
  expr[cell_type %in% c("hesc","fibroblast")]

o filtrare con operatore %like% per pattern matching

 expr[cell_type %like% "hesc"|cell_type %like% "fibroblast"]
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top