根据单词列表拆分字符串
Split string base on a list of words
假设我有一列:
是否有简单的方法使用 tidyverse 根据模式列表将列拆分为两列?
例如,列表将包含 c(ATOM、SOL、BUSD、UNI),并且基于此列表,列将像这样拆分
谢谢
PS:我只能以非常复杂的方式搜索和删除模式来执行此操作,因此我正在寻找更简单的解决方案。
这样的事情怎么样:
rx <- "^(ATOM|SOL|BUSH|UNI)(.*)$"
d %>% cbind( str_match( .$Pair, rx )[,-1] )
tidyr::separate
和零宽度正则表达式 可能 有效,但不支持可变宽度零宽度模式。有一段时间了。真是太可惜了。
这是一个想法。我们可以构造正确的正则表达式调用,然后使用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"
)
创建一串模式并使用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)))
假设我有一列:
是否有简单的方法使用 tidyverse 根据模式列表将列拆分为两列?
例如,列表将包含 c(ATOM、SOL、BUSD、UNI),并且基于此列表,列将像这样拆分
谢谢
PS:我只能以非常复杂的方式搜索和删除模式来执行此操作,因此我正在寻找更简单的解决方案。
这样的事情怎么样:
rx <- "^(ATOM|SOL|BUSH|UNI)(.*)$"
d %>% cbind( str_match( .$Pair, rx )[,-1] )
tidyr::separate
和零宽度正则表达式 可能 有效,但不支持可变宽度零宽度模式。有一段时间了。真是太可惜了。
这是一个想法。我们可以构造正确的正则表达式调用,然后使用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"
)
创建一串模式并使用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)))