Предположим, у меня есть список строк: 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
У меня есть связанный вопрос. Как вы извлекаете строку из начала строки до второго вхождения запятой?