Oto kilka sposobów:
1) podp
sub(".*:", "", string)
2) strsplit
sapply(strsplit(string, ":"), "[", 2)
3) przeczytaj. Tabelę
read.table(text = string, sep = ":", as.is = TRUE)$V2
4) podciąg
Zakłada się, że druga część zawsze zaczyna się od 4 znaku (tak jest w przykładzie w pytaniu):
substring(string, 4)
4a) podciąg / wyrażenie regularne
Gdyby dwukropek nie zawsze znajdował się w znanej pozycji, moglibyśmy zmodyfikować (4), wyszukując go:
substring(string, regexpr(":", string) + 1)
5) strapplyc
strapplyc
zwraca część w nawiasach:
library(gsubfn)
strapplyc(string, ":(.*)", simplify = TRUE)
6) przeczytaj.dcf
Ten działa tylko wtedy, gdy podciągi przed dwukropkiem są unikalne (tak jak w przykładzie w pytaniu). Wymaga również, aby separatorem był dwukropek (o którym mowa w pytaniu). Gdyby został użyty inny separator, moglibyśmy sub
najpierw zastąpić go dwukropkiem. Na przykład, jeśli separator był _
wtedystring <- sub("_", ":", string)
c(read.dcf(textConnection(string)))
7) oddzielne
7a) Używając tidyr::separate
, tworzymy ramkę danych z dwiema kolumnami, jedną dla części przed dwukropkiem, a drugą dla części po, a następnie wyodrębniamy drugą.
library(dplyr)
library(tidyr)
library(purrr)
DF <- data.frame(string)
DF %>%
separate(string, into = c("pre", "post")) %>%
pull("post")
7b) Alternatywnie separate
można użyć tylko do utworzenia post
kolumny, a następnie unlist
i unname
wynikowej ramki danych:
library(dplyr)
library(tidyr)
DF %>%
separate(string, into = c(NA, "post")) %>%
unlist %>%
unname
8) trimws Możemy użyć trimws
do przycięcia znaków słów z lewej strony, a następnie użyć go ponownie do przycięcia dwukropka.
trimws(trimws(string, "left", "\\w"), "left", ":")
Uwaga
string
Zakłada się, że dane wejściowe to:
string <- c("G1:E001", "G2:E002", "G3:E003")
_
jako separator i utworzyłem dwie oddzielne zmienne dla przedrostka i sufiksu w oparciu o odpowiedź @Grothendieck:prefix <- sub("_.*", "", variable)
isuffix <- sub(".*_", "", variable)
Na przykład za pomocą
gsub
lubsub
gsub('.*:(.*)','\\1',string) [1] "E001" "E002" "E003"
źródło
Oto kolejna prosta odpowiedź
gsub("^.*:","", string)
źródło
Spóźniony na imprezę, ale dla potomnych, pakiet stringr (część popularnego zestawu pakietów „tidyverse”) udostępnia teraz funkcje ze zharmonizowanymi sygnaturami do obsługi ciągów:
string <- c("G1:E001", "G2:E002", "G3:E003") # match string to keep stringr::str_extract(string = string, pattern = "E[0-9]+") # [1] "E001" "E002" "E003" # replace leading string with "" stringr::str_remove(string = string, pattern = "^.*:") # [1] "E001" "E002" "E003"
źródło
To powinno wystarczyć:
gsub("[A-Z][1-9]:", "", string)
daje
[1] "E001" "E002" "E003"
źródło
Jeśli używasz
data.table
wtedytstrsplit()
jest naturalnym wyborem:tstrsplit(string, ":")[[2]] [1] "E001" "E002" "E003"
źródło
Unglue pakiet stanowi alternatywę, nie ma wiedzy na temat wyrażeń regularnych jest wymagane w przypadku prostych przypadkach, tutaj chcielibyśmy zrobić:
# install.packages("unglue") library(unglue) string = c("G1:E001", "G2:E002", "G3:E003") unglue_vec(string,"{x}:{y}", var = "y") #> [1] "E001" "E002" "E003"
Utworzono 06.11.2019 przez pakiet reprex (v0.3.0)
Więcej informacji: https://github.com/moodymudskipper/unglue/blob/master/README.md
źródło
Inna metoda wyodrębniania podciągu
library(stringr) substring <- str_extract(string, regex("(?<=:).*")) #[1] "E001" "E002" "E003
(?<=:)
: spójrz za okrężnicę (:
)źródło