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.
sry falsch die Frage gelesen. Könnten Sie die Beispieldaten bereitstellen? – BigDataScientist
Es ist in der Frage. – Workhorse
Schwierig, das in R zu bekommen, können Sie es mit 'dput()' – BigDataScientist