使用 str_split 的模式向量,但同时排除某些模式
use vector of patterns for str_split, but at the same time exclude certain patterns
假设以下数据:
df <- data.frame(x = c("text, mail", "app.phone", "phone-text-mail", "e-mail", "e-mail, phone"))
我现在想将 x 列中的文本分成几个 separators/delimiters。这里我想使用最常见的:",", ".", "-".
但是,这对于术语“电子邮件”来说是有问题的。所以我想知道是否有任何方法可以创建某种排除列表,我可以在其中定义不能拆分的术语。
这就是我的设想:
delims <- c(",", ".", "-")
exclusions <- c("e-mail")
library(tidyverse)
df %>%
mutate(split_x = str_split(x, delims)) # This would also split "e-mail"
那么我如何在 str_split
函数中定义我的模式,以便它忽略我在 exclusions
中定义的所有术语?
在我的真实示例中,我有更多潜在的分隔符,但也有更多潜在的排除项,因此我正在寻找一种解决方案,我可以将我的排除项作为向量传递。不确定这是否可以通过正则表达式完成,或者我是否需要 1. 在 x 列的任何行中搜索我的排除项的存在,然后不要拆分该行。但是,这对于最后一个示例行会有问题,因为该行在出现“电子邮件”后确实包含有效分隔符。
预期结果:
x split_x_1 split_x_2 split_x_3
text, mail text mail NA
app.phone app phone NA
phone-text-mail phone text mail
e-mail e-mail NA NA
e-mail, phone e-mail phone NA
我们可以skip
他们
lst1 <- strsplit(df$x, "e-mail(*SKIP)(*F)|[,.-]", perl = TRUE)
df[paste0('split_x_', 1:3)] <- do.call(rbind, lapply(lst1,
`length<-`, max(lengths(lst1))))
-输出
df
# x split_x_1 split_x_2 split_x_3
#1 text, mail text mail <NA>
#2 app.phone app phone <NA>
#3 phone-text-mail phone text mail
#4 e-mail e-mail <NA> <NA>
#5 e-mail, phone e-mail phone <NA>
假设以下数据:
df <- data.frame(x = c("text, mail", "app.phone", "phone-text-mail", "e-mail", "e-mail, phone"))
我现在想将 x 列中的文本分成几个 separators/delimiters。这里我想使用最常见的:",", ".", "-".
但是,这对于术语“电子邮件”来说是有问题的。所以我想知道是否有任何方法可以创建某种排除列表,我可以在其中定义不能拆分的术语。
这就是我的设想:
delims <- c(",", ".", "-")
exclusions <- c("e-mail")
library(tidyverse)
df %>%
mutate(split_x = str_split(x, delims)) # This would also split "e-mail"
那么我如何在 str_split
函数中定义我的模式,以便它忽略我在 exclusions
中定义的所有术语?
在我的真实示例中,我有更多潜在的分隔符,但也有更多潜在的排除项,因此我正在寻找一种解决方案,我可以将我的排除项作为向量传递。不确定这是否可以通过正则表达式完成,或者我是否需要 1. 在 x 列的任何行中搜索我的排除项的存在,然后不要拆分该行。但是,这对于最后一个示例行会有问题,因为该行在出现“电子邮件”后确实包含有效分隔符。
预期结果:
x split_x_1 split_x_2 split_x_3
text, mail text mail NA
app.phone app phone NA
phone-text-mail phone text mail
e-mail e-mail NA NA
e-mail, phone e-mail phone NA
我们可以skip
他们
lst1 <- strsplit(df$x, "e-mail(*SKIP)(*F)|[,.-]", perl = TRUE)
df[paste0('split_x_', 1:3)] <- do.call(rbind, lapply(lst1,
`length<-`, max(lengths(lst1))))
-输出
df
# x split_x_1 split_x_2 split_x_3
#1 text, mail text mail <NA>
#2 app.phone app phone <NA>
#3 phone-text-mail phone text mail
#4 e-mail e-mail <NA> <NA>
#5 e-mail, phone e-mail phone <NA>