Filtrata data.frame righe da uno stato logico
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.
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"]