Frage extrahiere einen Teilstring in R nach einem Muster


Angenommen, ich habe eine String-Liste: string = c("G1:E001", "G2:E002", G3:E003). Jetzt hoffe ich, einen String-Vektor zu erhalten, der nur die Teile nach dem Doppelpunkt ":" enthält, d substring = c(E001,E002,E003). Gibt es dafür einen bequemen Weg in R? Verwenden substr? Vielen Dank!


75
2018-06-20 14:06


Ursprung


Antworten:


Hier sind ein paar Möglichkeiten:

1) Sub

sub(".*:", "", string)
## [1] "E001" "E002" "E003"

2) strsplit

sapply(strsplit(string, ":"), "[", 2)
## [1] "E001" "E002" "E003"

3) read.table

read.table(text = string, sep = ":", as.is = TRUE)$V2
## [1] "E001" "E002" "E003"

4) Teilzeichenfolge

Dies setzt voraus, dass der zweite Teil immer bei 4 beginnt (was im Beispiel in der Frage der Fall ist):

substring(string, 4)
## [1] "E001" "E002" "E003"

4a) Teilstring / Regex 

Wenn der Doppelpunkt nicht immer in einer bekannten Position wäre, könnten wir (4) ändern, indem wir danach suchen:

substring(string, regexpr(":", string) + 1)

5) Strapplyc

strapplyc gibt den eingeklammerten Teil zurück:

library(gsubfn)
strapplyc(string, ":(.*)", simplify = TRUE)
## [1] "E001" "E002" "E003"

6) lesen.dcf 

Dieser funktioniert nur, wenn die Teilstrings vor dem Doppelpunkt eindeutig sind (was sie im Beispiel in der Frage sind). Außerdem muss das Trennzeichen Doppelpunkt sein (was in Frage steht). Wenn ein anderer Separator verwendet würde, könnten wir ihn verwenden sub um es zuerst durch einen Doppelpunkt zu ersetzen. Zum Beispiel, wenn der Separator wäre _ dann string <- sub("_", ":", string)

c(read.dcf(textConnection(string)))
## [1] "E001" "E002" "E003"

HINZUGEFÜGT. strapplyc und read.dcf Lösungen.

HINWEIS.

Die Eingabe string wird angenommen:

string <- c("G1:E001", "G2:E002", "G3:E003")

133
2018-06-20 14:10



Zum Beispiel mit gsub oder sub

    gsub('.*:(.*)','\\1',string)
    1] "E001" "E002" "E003"

17
2018-06-20 14:10



Hier ist eine weitere einfache Antwort

gsub("^.*:","", string)

9
2018-04-21 19:49



Dies sollte tun:

gsub("[A-Z][1-9]:", "", string)

gibt

[1] "E001" "E002" "E003"

4
2018-06-20 14:10