#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
с регулярным выражением нулевой ширины могло бы сработать, но шаблоны переменной ширины с нулевой шириной не поддерживаются. В течение некоторого времени. Что действительно обидно.