wake-up-neo.com

Filtern Sie data.frame-Zeilen nach einer logischen Bedingung

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.

125
lhahne

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"), ]
178
learnr

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"))
76
rcs

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
29
Ken Williams

Sie können das Paket dplyr verwenden:

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

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),]
2
Justin Harbour

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", ]
2
Daniel Bonetti

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. 

1
eigenfoo

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"]
0
Varn K