我在数据框中有一系列字符串,如下所示:
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
我不能用空格分隔它们,因为时间和项目列表中的单词数量不同。我也没有将它们分开的符号。我觉得应该有一个非常简单而优雅的方法来解决这个问题,但我无法弄清楚。
答案 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运算符,从而有效地分割time
。 sapply(...,
[, 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创建。