Как извлечь последнюю встречающуюся строку в скобках со строкой столбца в другой столбец, используя stringr? - PullRequest
1 голос
/ 28 апреля 2020

У меня есть набор случайного текста в столбце, например:

dplyr::tibble(text = c("I have a (brown) clock", "surrounded by (red) walls", "inside of a (blue) building with (dirty) windows",
                      "where (magical) things (unexpectedly) occur (spontaneously)"))

# A tibble: 4 x 1
  text                                                       
  <chr>                                                      
1 I have a (brown) clock                                     
2 surrounded by (red) walls                                  
3 inside of a (blue) building with (dirty) windows           
4 where (magical) things (unexpectedly) occur (spontaneously)

Я бы хотел извлечь последнюю встречающуюся строку в скобках в другой столбец, чтобы она выглядела так:

dplyr::tibble(text = c("I have a (brown) clock", "surrounded by (red) walls", "inside of a (blue) building with (dirty) windows",
                          "where (magical) things (unexpectedly) occur (spontaneously)"),
                  extract = c("brown", "red", "dirty", "spontaneously"))

# A tibble: 4 x 2
  text                                                        extract      
  <chr>                                                       <chr>        
1 I have a (brown) clock                                      brown        
2 surrounded by (red) walls                                   red          
3 inside of a (blue) building with (dirty) windows            dirty        
4 where (magical) things (unexpectedly) occur (spontaneously) spontaneously

1 Ответ

2 голосов
/ 28 апреля 2020

Один вариант - stri_extract_last из stringi, и он должен быть быстрым. Здесь мы делаем поиск по регулярному выражению, чтобы соответствовать открывающей скобке ((?<=\\()), за которой следуют один или несколько символов, которые не являются закрывающими скобками ([^\\)]+)

library(dplyr)
df1 %>%
    mutate(extract = stringi::stri_extract_last(text, regex = "(?<=\\()[^\\)]+"))
# A tibble: 4 x 2
#  text                                                        extract      
#  <chr>                                                       <chr>        
#1 I have a (brown) clock                                      brown        
#2 surrounded by (red) walls                                   red          
#3 inside of a (blue) building with (dirty) windows            dirty        
#4 where (magical) things (unexpectedly) occur (spontaneously) spontaneously
...