Filter data.frame Reihen durch einen logischen Zustand
Frage
Ich möchte zum Filtern von Zeilen aus einem data.frame
auf einer logischen Bedingung basiert. Nehmen wir an, dass ich Datenrahmen haben wie
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
Was ich will, ist ein neues Datenrahmen zu erhalten, die gleich aussieht, hat aber nur die Daten für einen cell_type. Z.B. Untergruppe wählen / Zeilen, die den Zellentyp „HES“ enthalten:
expr_value cell_type
1 5.929771 hesc
2 5.873096 hesc
3 5.665857 hesc
oder entweder Zelltyp "bj Fibroblasten" oder "HES":
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
Gibt es eine einfache Möglichkeit, dies zu tun?
Ich habe versucht:
expr[expr[2] == 'hesc']
# [1] "5.929771" "5.873096" "5.665857" "hesc" "hesc" "hesc"
, wenn der ursprüngliche Datenrahmen genannt wird „expr“, aber es gibt die Ergebnisse in falschem Format wie Sie sehen können.
Lösung
Zeilen auszuwählen, entsprechend ein 'cell_type' (z 'HES'), die Verwendung ==
:
expr[expr$cell_type == "hesc", ]
Zeilen auszuwählen, entsprechend zwei oder mehr verschiedenen 'cell_type', (z.B. entweder 'HES' oder 'bj Fibroblast'), die Verwendung %in%
:
expr[expr$cell_type %in% c("hesc", "bj fibroblast"), ]
Andere Tipps
Verwenden subset
(für interaktive Nutzung)
subset(expr, cell_type == "hesc")
subset(expr, cell_type %in% c("bj fibroblast", "hesc"))
oder besser dplyr::filter()
filter(expr, cell_type %in% c("bj fibroblast", "hesc"))
Der Grund expr[expr[2] == 'hesc']
nicht funktioniert, ist, dass für einen Datenrahmen, x[y]
Spalten auswählt, keine Zeilen. Wenn Sie möchten, um Zeilen auszuwählen, auf die Syntax x[y,]
stattdessen ändern:
> expr[expr[2] == 'hesc',]
expr_value cell_type
4 5.929771 hesc
5 5.873096 hesc
6 5.665857 hesc
Sie könnten das dplyr
Paket verwenden:
library(dplyr)
filter(expr, cell_type == "hesc")
filter(expr, cell_type == "hesc" | cell_type == "bj fibroblast")
Manchmal ist die Spalte, die Sie filtern möchten in einer anderen Position als Spaltenindex 2 oder haben einen Variablennamen erscheinen.
In diesem Fall können Sie einfach beziehen sich die Spaltenname Sie filtern möchten, wie:
columnNameToFilter = "cell_type"
expr[expr[[columnNameToFilter]] == "hesc", ]
Ich war auf einem Datenrahmen arbeiten und kein Glück mit den bereitgestellten Antworten, die es zurück immer 0 Zeilen, also habe ich gefunden und verwendet Grepl:
df = df[grepl("downlink",df$Transmit.direction),]
, die im Grunde meinen Datenrahmen der Zeilen nur getrimmt, die „Downlink“ in der Senderichtung Spalte enthalten ist. P. S. Wenn jemand erraten, warum ich nicht das erwartete Verhalten zu sehen, lassen Sie einen Kommentar.
Speziell auf die ursprüngliche Frage:
expr[grepl("hesc",expr$cell_type),]
expr[grepl("bj fibroblast|hesc",expr$cell_type),]
scheint niemand die die Funktion aufgenommen zu haben. Es kann auch nützlich für die Filterung unter Beweis stellen.
expr[which(expr$cell == 'hesc'),]
Dies wird auch NAs behandeln und aus dem resultierenden Datenrahmen fallen.
Ausführen dieses auf einem 9840 von 24 Datenrahmen 50000 mal, wie es scheint, die das Verfahren hat eine 60% schnellere Laufzeit als das% in% -Methode.
können wir data.table Bibliothek
verwenden library(data.table)
expr <- data.table(expr)
expr[cell_type == "hesc"]
expr[cell_type %in% c("hesc","fibroblast")]
oder Filter verwendet %like%
Operator für den Mustervergleich
expr[cell_type %like% "hesc"|cell_type %like% "fibroblast"]