Разделить базу строк на список слов

#r #dplyr #tidyverse #data-wrangling

#r #dplyr #tidyverse #перебор данных

Вопрос:

Представьте, что у меня есть столбец:

введите описание изображения здесь

Есть ли простой способ с помощью tidyverse разделить столбец на два столбца на основе списка шаблонов?

Например, список будет содержать c (ATOM, SOL, BUSD, UNI), и на основе этого списка столбец будет разделен следующим образом

введите описание изображения здесь

Спасибо

PS: Я могу сделать это только очень сложным способом поиска и удаления шаблонов, поэтому я ищу более простое решение.

Ответ №1:

Создайте одну строку шаблонов и используйте str_extract_all ее для извлечения соответствующих ключевых слов.

Использование данных @www :

 library(stringr)
target_string <- c("ATOM", "SOL", "UNI", "BUSD", "BTC")
do.call(rbind, str_extract_all(dat$Text, str_c(target_string, collapse = '|')))

#       [,1]   [,2]  
#[1,] "ATOM" "BUSD"
#[2,] "SOL"  "BTC" 
#[3,] "SOL"  "BUSD"
#[4,] "SOL"  "BUSD"
#[5,] "UNI"  "BUSD"
 

Или аналогичный базовый R способ :

 do.call(rbind, regmatches(dat$Text, gregexpr(paste0(target_string, collapse = '|'), dat$Text)))
 

Ответ №2:

Вот одна идея. Мы можем сконструировать правильный вызов регулярного выражения, а затем использовать extract для разделения данных. В этом примере я предполагаю, что сценарий заключается в том, что вам нужно найти первый столбец со строками target_string , сохраняя при этом все во второй строке.

 library(tidyverse)

target_string <- c("ATOM", "SOL", "UNI")
target_regex <- paste0("(", paste0(paste0("^", target_string), collapse = "|"), ")(.*)")

dat2 <- dat %>%
  extract(Text, into = c("Col1", "Col2"), regex = target_regex)
dat2
# # A tibble: 5 x 2
#   Col1  Col2 
#   <chr> <chr>
# 1 ATOM  BUSD 
# 2 SOL   BTC  
# 3 SOL   BUSD 
# 4 SOL   BUSD 
# 5 UNI   BUSD 
 

ДАННЫЕ

 dat <- tribble(
  ~Text,
  "ATOMBUSD",
  "SOLBTC",
  "SOLBUSD",
  "SOLBUSD",
  "UNIBUSD"
)
 

Ответ №3:

Как насчет чего-то вроде этого:

     rx <- "^(ATOM|SOL|BUSH|UNI)(.*)$"
    d %>% cbind( str_match( .$Pair, rx )[,-1] )
 

tidyr::separate с регулярным выражением нулевой ширины могло бы сработать, но шаблоны переменной ширины с нулевой шириной не поддерживаются. В течение некоторого времени. Что действительно обидно.