Ich möchte Zeilen aus einem data.frame
basierend auf einer logischen Bedingung filtern. Nehmen wir an, ich habe einen Datenrahmen
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 möchte, ist, einen neuen Datenrahmen zu erhalten, der gleich aussieht, aber nur die Daten für einen cell_type hat. Z.B. Teilmenge/Zeilen auswählen, die den Zelltyp "hesc" enthalten:
expr_value cell_type
1 5.929771 hesc
2 5.873096 hesc
3 5.665857 hesc
Oder entweder den Zelltyp "bj fibroblast" oder "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
Gibt es eine einfache Möglichkeit, dies zu tun?
Ich habe es versucht:
expr[expr[2] == 'hesc']
# [1] "5.929771" "5.873096" "5.665857" "hesc" "hesc" "hesc"
wenn der ursprüngliche Datenrahmen "expr" genannt wird, werden jedoch die Ergebnisse im falschen Format angezeigt, wie Sie sehen können.
Um Zeilen nach one 'cell_type' (z. B. 'hesc') auszuwählen, verwenden Sie ==
:
expr[expr$cell_type == "hesc", ]
Um Zeilen nach zwei oder mehr verschiedenen 'cell_type' auszuwählen (z. B. 'hesc' oder 'bj-Fibroblast'), verwenden Sie %in%
expr[expr$cell_type %in% c("hesc", "bj fibroblast"), ]
Verwenden Sie subset
(für die interaktive Verwendung)
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"))
expr[expr[2] == 'hesc']
funktioniert nicht, weil x[y]
für einen Datenrahmen Spalten und nicht Zeilen auswählt. Wenn Sie Zeilen auswählen möchten, wechseln Sie stattdessen zur Syntax x[y,]
:
> expr[expr[2] == 'hesc',]
expr_value cell_type
4 5.929771 hesc
5 5.873096 hesc
6 5.665857 hesc
Sie können das Paket dplyr
verwenden:
library(dplyr)
filter(expr, cell_type == "hesc")
filter(expr, cell_type == "hesc" | cell_type == "bj fibroblast")
Ich arbeitete an einem Datenrahmen und hatte mit den bereitgestellten Antworten kein Glück, er gab immer 0 Zeilen zurück, also habe ich grepl gefunden und verwendet:
df = df[grepl("downlink",df$Transmit.direction),]
Was mein Datenframe im Wesentlichen auf die Zeilen reduziert hat, die "Downlink" in der Spalte "Übertragungsrichtung" enthalten. P.S. Wenn jemand raten kann, warum ich das erwartete Verhalten nicht sehe, hinterlassen Sie bitte einen Kommentar.
Speziell zur ursprünglichen Frage:
expr[grepl("hesc",expr$cell_type),]
expr[grepl("bj fibroblast|hesc",expr$cell_type),]
Manchmal erscheint die Spalte, die Sie filtern möchten, an einer anderen Position als Spaltenindex 2 oder hat einen Variablennamen.
In diesem Fall können Sie einfach auf den Spaltennamen verweisen, den Sie filtern möchten:
columnNameToFilter = "cell_type"
expr[expr[[columnNameToFilter]] == "hesc", ]
Niemand scheint die welche Funktion aufgenommen zu haben. Es kann sich auch für die Filterung als nützlich erweisen.
expr[which(expr$cell == 'hesc'),]
Dies behandelt auch NAs und löscht sie aus dem resultierenden Datenrahmen.
Wenn Sie dies 50000 Mal auf einem 9840 x 24-Datenrahmen ausführen, scheint es, als hätte die Methode eine um 60% schnellere Laufzeit als die% in% -Methode.
wir können die data.table-Bibliothek verwenden
library(data.table)
expr <- data.table(expr)
expr[cell_type == "hesc"]
expr[cell_type %in% c("hesc","fibroblast")]
oder filtern Sie den %like%
-Operator für den Musterabgleich
expr[cell_type %like% "hesc"|cell_type %like% "fibroblast"]