Подтвердить что ты не робот

Извлечение подстроки в R по шаблону

Предположим, у меня есть список строк: string = c("G1:E001", "G2:E002", "G3:E003"). Теперь я надеюсь получить вектор строки, который содержит только части после двоеточия ":", то есть substring = c(E001,E002,E003). Есть ли удобный способ в R сделать это? Использование substr? Благодарю!

4b9b3361

Ответ 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

У меня есть связанный вопрос. Как вы извлекаете строку из начала строки до второго вхождения запятой?