Витягніть підрядок за зразком


136

Припустимо, у мене є список рядків:

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

Тепер я сподіваюся отримати вектор рядка, який містить лише частини після двокрапки ":", тобто substring = c(E001,E002,E003).

Чи є в R зручний спосіб зробити це? Використовуючи substr?

Відповіді:


239

Ось кілька способів:

1) підряд

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

2) стрспліт

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

3) для читання

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) окремо

7а) Використовуючи, 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"

7b) По черзі separateможна використовувати просто створення postстовпця, а потімunlist і unnameотриманий кадр даних:

library(dplyr)
library(tidyr)

DF %>% 
  separate(string, into = c(NA, "post")) %>% 
  unlist %>%
  unname
## [1] "E001" "E002" "E003"

8) обрізки Ми можемо використовуватиtrimws для обрізання символів слова зліва, а потім знову використовувати для обрізки двокрапки.

trimws(trimws(string, "left", "\\w"), "left", ":")
## [1] "E001" "E002" "E003"

Примітка

Вхід stringвважається таким:

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

Я мав змінну у розплавленій таблиці, яка мала _як роздільник і зробила дві окремі змінні для префікса та суфікса на основі відповіді @Grothendieck: prefix <- sub("_.*", "", variable)та suffix <- sub(".*_", "", variable)
swihart

Було б непогано побачити мікробензинову оцінку цієї дивовижної відповіді!
ПтЛ

25

Наприклад, використовуючи gsubабоsub

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

Ви могли б пояснити, що це? * (* і т. д. саме там? Мені важко відтворити це в лише дещо іншому оточенні ...
Пітер Пан

1
@PeterPan Це захоплює та повертає групу символів, що з’являються після двокрапки. Якщо рядки збігаються складніше і ви хочете залишитися в базі R, це добре працює.
Кларк Фіцджеральд


9

Пізно до партії, але для нащадків, пакет stringr (частина популярного пакету пакетів "tidyverse") тепер надає функції з гармонізованими підписами для обробки рядків:

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"

2
Чи не це знаходження перше число, яке починається з Е, а не все після двокрапки?
Марк Ніл


3

Якщо ви використовуєте, data.tableто tstrsplit()це природний вибір:

tstrsplit(string, ":")[[2]]
[1] "E001" "E002" "E003"

3

Пакет видалення видаляє альтернативу, ніяких знань про регулярні вирази не потрібно для простих випадків, ось що ми зробимо:

# install.packages("unglue")
library(unglue)
string = c("G1:E001", "G2:E002", "G3:E003")
unglue_vec(string,"{x}:{y}", var = "y")
#> [1] "E001" "E002" "E003"

Створено 2019-11-06 пакетом reprex (v0.3.0)

Більше інформації: https://github.com/moodymudskipper/unglue/blob/master/README.md

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.