Предположим, у меня есть список строк: string = c("G1:E001", "G2:E002", "G3:E003")
. Теперь я надеюсь получить вектор строки, который содержит только части после двоеточия ":", то есть substring = c(E001,E002,E003)
. Есть ли удобный способ в R сделать это? Использование substr
? Благодарю!
Извлечение подстроки в R по шаблону
Ответ 1
Вот несколько способов:
1) суб
sub(".*:", "", string)
## [1] "E001" "E002" "E003"
2) Стрсплит
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) подстрока
Это предполагает, что вторая часть всегда начинается с 4-го символа (что имеет место в примере в вопросе):
substring(string, 4)
## [1] "E001" "E002" "E003"
4а) подстрока/регулярное выражение
Если бы двоеточие не всегда было в известной позиции, мы могли бы изменить (4), выполнив его поиск:
substring(string, regexpr(":", string) + 1)
5) страпплик
strapplyc
возвращает часть в скобках:
library(gsubfn)
strapplyc(string, ":(.*)", simplify = TRUE)
## [1] "E001" "E002" "E003"
6) read.dcf
Этот работает, только если подстроки перед двоеточием уникальны (что они в примере в вопросе). Также требуется, чтобы разделитель был двоеточием (о чем идет речь). Если бы использовался другой разделитель, то мы могли бы использовать sub
чтобы сначала заменить его двоеточием. Например, если разделитель был _
то string <- sub("_", ":", string)
c(read.dcf(textConnection(string)))
## [1] "E001" "E002" "E003"
7) tidyr::separate
Используя tidyr::separate
мы создаем фрейм данных с двумя столбцами, один для части перед двоеточием и один для после, а затем извлекаем последний.
library(dplyr)
library(tidyr)
library(purrr)
DF <- data.frame(string)
DF %>%
separate(string, into = c("pre", "post")) %>%
pull("post")
## [1] "E001" "E002" "E003"
7а) В качестве альтернативы separate
может быть использованы, чтобы просто создать post
колонки, а затем unlist
и unname
полученного фрейма данных:
library(dplyr)
library(tidyr)
DF %>%
separate(string, into = c(NA, "post")) %>%
unlist %>%
unname
## [1] "E001" "E002" "E003"
ADDED. strapplyc
, read.dcf
и separate
решения.
НОТА.
Предполагается, что входная string
:
string <- c("G1:E001", "G2:E002", "G3:E003")
Ответ 2
Например, используя gsub
или sub
gsub('.*:(.*)','\\1',string)
1] "E001" "E002" "E003"
Ответ 3
Вот еще один простой ответ
gsub("^.*:","", string)
Ответ 4
Поздняя вечеринка, но для потомков пакет stringr (часть популярного пакета "tidyverse" пакетов) теперь предоставляет функции с согласованными сигнатурами для обработки строк:
string <- c("G1:E001", "G2:E002", "G3:E003")
stringr::str_extract(string = string, pattern = "E[0-9]+")
# [1] "E001" "E002" "E003"
Ответ 5
Это должно сделать:
gsub("[A-Z][1-9]:", "", string)
дает
[1] "E001" "E002" "E003"
Ответ 6
Если вы используете data.table
то tstrsplit()
является естественным выбором:
tstrsplit(string, ":")[[2]]
[1] "E001" "E002" "E003"
Ответ 7
У меня есть связанный вопрос. Как вы извлекаете строку из начала строки до второго вхождения запятой?