2017-02-18 1 views
1

Ich habe einen Datenrahmen, und ich habe eine Liste von IDs, die ich durchsuchen möchte, um zu überprüfen, ob sie in diesem Datenrahmen sind. Dieser Datenrahmen sieht aus, als solche:Suche nach mehreren Elementen in Spalte eines Datenrahmens in R

dput(bed,"mybed.bed") 
sample <- c("13874.p1", "13609.p1","12736.p1", "11970.p1","12025.p1","12189.p1","12529.p1","11522.p1","11716.p1","13684.p1") 

Ich mochte die Zeilen des Datenrahmen zurückzukehren eine der Wert geteilt durch den sample Vektor und df$sample_ID enthält.

Ich versuchte mit sapply(samples, grepl, df$sample_ID), aber es nur, wenn das erste Element der Probe vorhanden ist. Jede Hilfe würde geschätzt werden !!

+0

sry falsch die Frage gelesen. Könnten Sie die Beispieldaten bereitstellen? – BigDataScientist

+0

Es ist in der Frage. – Workhorse

+0

Schwierig, das in R zu bekommen, können Sie es mit 'dput()' – BigDataScientist

Antwort

0

Ich denke, ich habe eine Lösung dafür, mit: str_locate_all von stringr Paket. Zum Beispiel:

v <- c("abc11", "abc11abc11", "abc11abc11abc11abc") 
library(stringr) 
result1 <- str_locate_all(v[1], "11") 
result2 <- str_locate_all(v[2], "11") 
result3 <- str_locate_all(v[3], "11") 

Der Ausgang eine Zeile pro Spiel mit einem Paar von Werten Start-Ende (des Spieles) zeigt:

> result1 
[[1]] 
    start end 
[1,]  4 5 

> result2 
[[1]] 
    start end 
[1,]  4 5 
[2,]  9 10 

> result3 
[[1]] 
    start end 
[1,]  4 5 
[2,]  9 10 
[3,] 14 15 
> 

das Ergebnis in einer wenig unangenehm Struktur gespeichert ist:

> class(result3) 
[1] "list" 
> length(result3) 
[1] 1 
> 

Und dieses einzigartige Element eine ganze Zahl Matrix:

> class(result3[[1]]) 
[1] "matrix" 
> dim(result3[[1]]) 
[1] 3 2 
> 

Die Funktion str_locate bietet eine einfachere Ausgabe, findet jedoch nur die erste Übereinstimmung.

Meine Empfehlung wäre dieses erste Element der Liste zu extrahieren und dann mit ihm zum Beispiel arbeiten:

m <- result3[[1]]

Nicht wäre es einfacher Zugriff auf die Informationen als eine gespeicherte zu erhalten Matrix 3x2 für result3:

> m 
    start end 
[1,]  4 5 
[2,]  9 10 
[3,] 14 15 

Nun wissen die Anzahl der Treffer:

> nrow(m) 
[1] 3 

oder dim(m)[1].

So mit dem Ergebnis in einer Matrix gespeichert ist, ist es einfacher, die Informationen zu extrahieren. Um alle passenden Positionen auf dem Eingabeargument nur die erste Spalte extrahieren:

> m[,1] 
[1] 4 9 14 

--------------------------------------------------------------------------------

EDIT

die bisherigen Konzepte Nehmen, um das ursprüngliche Problem, also finden die Spiele für eine Array von M-Patterns innerhalb eines Arrays von N-Werten.

--------------------------------------------------------------------------------

Zurück zu dem, was ich verstehe Ihr Problem ist, lassen Sie uns sagen, dass wir die folgenden Datenrahmen haben:

df = data.frame(ID = c(1,2,3,4), 
sample_ID = c(
    "12613.p1", 
    "12613.p1", 
    "11401.p1,11120.p1,11199.p1,11226.p1,11395.p1,11296.p1,11333.p1,11374.p1,11388.p1,11395.p1,11420.p1", 
    "11401.p1,13863.p1"), 
stringsAsFactors = F) 

Jetzt haben wir die folgende Beispielvektor:

sample <- c("11120.p1", "11395.p1", "12613.p1", "13863.p1", "11401.p1") 

Die df hat 4 Zeilen und das sample Array hat 5 Zeilen. Jetzt auf der Grundlage der vorherigen Erklärung, lässt suchen, wo in df$sample_ID wir die Elemente von sample mit lapply Funktion finden:

library(stringr) 
all <- sapply(df$sample_ID, FUN = function(x) {return(str_locate_all(x, sample))}) 

Jetzt wird ausgegeben:

> class(all) 
[1] "matrix" 

wo

> dim(all) 
[1] 5 4 

Daher haben wir für jedes Element sample 5-Spalten mit dem Ergebnis für eine bestimmte Zeile aus der df$sample_ID (vier Spalten).

Wir erwarten, dass für jedes Element von sample folgendes Spiel:

Sample | df$sample_ID[1] | df$sample_ID[2] | df$sample_ID[3] | df$sample_ID[4] 
------- | -----------------|------------------|-----------------|--------------- 
11120.p1 |  0   |  0   |  1   |  0  
11395.p1 |  0   |  0   |  2   |  0  
12613.p1 |  1   |  1   |  0   |  0  
13863.p1 |  0   |  0   |  0   |  1  
11401.p1 |  1   |  0   |  1   |  0 

Dies ist das Ergebnis erhalten wird:

> all 
    12613.p1 12613.p1 
[1,] Integer,0 Integer,0 
[2,] Integer,0 Integer,0 
[3,] Integer,2 Integer,2 
[4,] Integer,0 Integer,0 
[5,] Integer,0 Integer,0 
    11401.p1,11120.p1,11199.p1,11226.p1,11395.p1,11296.p1,11333.p1,11374.p1,11388.p1,11395.p1,11420.p1 
[1,] Integer,2                       
[2,] Integer,4                       
[3,] Integer,0                       
[4,] Integer,0                       
[5,] Integer,2                       
    11401.p1,13863.p1 
[1,] Integer,0   
[2,] Integer,0   
[3,] Integer,0   
[4,] Integer,2   
[5,] Integer,2   
> 

Jedes Element der Matrix ist ein list. Hier ist, wie das Ergebnis zu verstehen ist, für jede [row, col] bietet es eine zusammengefasste Informationen über die list Elemente: Integer,n wird die Anzahl der Elemente der angegebenen Zelle angeben. Für jedes Match haben wir zwei Werte: [start, end], Deshalb werden wir für M-Matches m x 2 haben. Deshalb hat es für [row, col] = [2,3] den Wert 4.

die Informationen zu extrahieren, kann an Wert für das Spiel sagen: sample[2]=11395.p1 für die dritte Reihe (df$sample_ID[3]) haben wir:

> all[2,3] 
$`11401.p1,11120.p1,11199.p1,11226.p1,11395.p1,11296.p1,11333.p1,11374.p1,11388.p1,11395.p1,11420.p1` 
    start end 
[1,] 37 44 
[2,] 82 89 

alle Spiele Positionen zu extrahieren:

> all[2,3][[1]][,1] 
[1] 37 82 

Zum Beispiel : m <- all[2,3][[1]] dann:

> m[,1] 
[1] 37 82 

Wie erkennt man eine nicht übereinstimmende Bedingung?

Lassen Sie uns [1,1] der ursprünglichen Matrix das Element auswählen, in denen es keine Übereinstimmung gibt, dann:

> m <- all[1,1][[1]] 
> dim(m) 
[1] 0 2 
> dim(m)[1] 
[1] 0 
> 

Ich hoffe, das jetzt Ihr Problem lösen.

1

Berufung:

unique(do.call(c, sapply(X = sample, FUN = function(x){return(grep(pattern = x,x = df$sample_id))}))) 

sollte funktionieren:

> df = data.frame(chrom = c(1,2,1,1), 
+     sample_id = c("12613.p1", "12613.p1","11118.p1,11120.p1,11199.p1,11226.p1,11285.p1,11296.p1,11333.p1,11374.p1,11388.p1,11395.p1,11420.p1", "11401.p1,13863.p1"), 
+     stringsAsFactors = F) 
> 
> 
> 
> sample <- c("13874.p1", "13609.p1","12736.p1", "11970.p1","12025.p1", 
+    "12189.p1","12529.p1","11522.p1","11716.p1","13684.p1") 
> 
> 
> unique(do.call(c, sapply(X = sample, FUN = function(x) {return(grep(pattern = x,x = df$sample_id))}))) 
integer(0) 

keine Lösung

Aber wenn ich eine letzte Zeichenfolge Probe hinzufügen:

> sample <- c("13874.p1", "13609.p1","12736.p1", "11970.p1","12025.p1", 
+    "12189.p1","12529.p1","11522.p1","11716.p1","13684.p1", 
+    "11199.p1") 
> 
> 
> unique(do.call(c, sapply(X = sample, FUN = function(x){return(grep(pattern = x,x = df$sample_id))}))) 
[1] 3 

Es funktioniert !!

0

Ich denke, ich fand eine einfache Lösung für dieses Problem (Entschuldigung dafür, dass ich keine realistischeren Daten posten konnte, mein Datensatz ist enorm).

So habe ich einen Zeichenvektor IDs, sample. Ich habe dann eine Tabelle, in der eine Spalte eine Liste von IDs pro Zeile enthält.

hits <- c() 
for(i in sample){ 
     hits <- append(hits, which(grepl(i, df$sample_ID, fixed = TRUE))) 
} 

hits2 <- unique(hits) 

Ich gehe gerade durch die sample Vektor, und jedes Mal, wenn ich überprüfen, um zu sehen, ob es in jeder df $ sample_ID Liste existiert. Er gibt die Zeilennummer (aus dem Datenrahmen) jedes positiven Treffers zurück. Da einige Zeilen möglicherweise zwei Übereinstimmungen aufweisen, lösche ich Duplikate.

Ich kann dann Teilmenge basierend auf diesen Zeilen.

df2 <- df[hits2,] 
Verwandte Themen