提取所有可能字符列表左侧的字符

时间:2018-08-13 17:57:45

标签: r string extract

我在数据框中有一系列字符串,如下所示:

item_time<-c("pink dress july noon", "shirt early september morning", "purple dress 
april", "tall purple shoes february")

我想提取所有可能的字符列表左侧的所有字符,如下所示:

time<-c("january", "january night", "february","march","april","may", "may 
morning", "june","july", "july noon","august","september","early september morning", 
"october","november","december")

我想要的结果看起来像这样:

[1] pink dress
[2] shirt
[3] purple dress
[4] tall purple shoes

我不能用空格分隔它们,因为时间和项目列表中的单词数量不同。我也没有将它们分开的符号。我觉得应该有一个非常简单而优雅的方法来解决这个问题,但我无法弄清楚。

3 个答案:

答案 0 :(得分:4)

我们可以在Base R中使用strsplit

sapply(strsplit(item_time, split=paste0("\\s", time, collapse="|")), `[`, 1)
# [1] "pink dress"        "shirt"             "purple dress"      "tall purple shoes"

注释:

我首先折叠time向量,并用|分隔每个项,然后使用它用item_time分割strsplit。由于strsplit中的split参数接受正则表达式,因此只要在|中看到其中一项,它就会将item_time解释为OR运算符,从而有效地分割timesapply(..., [, 1)然后查看列表中的每个元素并提取第一个元素,它将是分割后最左边的字符串。

答案 1 :(得分:2)

您可以使用sub,因为它是矢量化的

sub(paste0("\\s*",time,".*",collapse="|"),"",item_time)
[1] "pink dress"        "shirt"             "purple dress"      "tall purple shoes"

答案 2 :(得分:1)

执行此操作的一种方法是将可能字符的矢量转换为正则表达式模式,并使用它来提取正确的字符串,如下所示。

这是通过使用|来分隔所有可能字符的选项,然后将它们放置在前瞻(?= )中来实现的。这将尝试匹配选项列表之前的模式。然后,我们只需添加^.*即可在时间列表之前(从头开始)收集整个字符串。

请注意,如果time中的任何选项有特殊字符,此操作将失败,如果在NA的条目中未找到time中的任何选项,则返回item_time。 }。

item_time <- c(
  "pink dress july noon", "shirt september morning",
  "purple dress april", "tall purple shoes february"
)

time <- c(
  "january", "january night", "february", "march", "april", "may",
  "may morning", "june", "july", "july noon", "august", "september",
  "september morning", "october", "november", "december"
)

library(stringr)
pattern <- time %>%
  str_c(collapse = "|") %>%
  str_c("^.*(?= (", ., "))")

item_time %>%
  str_extract(pattern)
#> [1] "pink dress"        "shirt"             "purple dress"     
#> [4] "tall purple shoes"

reprex package(v0.2.0)于2018-08-13创建。