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.

War es hilfreich?

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"]
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top