【问题标题】:Extract all characters to the right of a list of possible characters提取可能字符列表右侧的所有字符
【发布时间】:2018-09-04 13:05:37
【问题描述】:

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

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

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

item<-c("pink dress","shirt","purple dress", "tall purple shoes")

我想要的结果是这样的:

[1] july noon
[2] early september morning
[3] april
[4] february

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

【问题讨论】:

标签: r string extract


【解决方案1】:

您可以使用sub 和正则表达式来做到这一点。

Pat = paste0("(.*)(", paste0(item, collapse="|"), ")(.*)")
sub(Pat, "\\3", item_time)
[1] " july noon"               " early september morning"
[3] " april"                   " february"  

详情:创建的模式是:

Pat
[1] "(.*)(pink dress|shirt|purple dress|tall purple shoes)(.*)"

中间部分"(.*)(pink dress|shirt|purple dress|tall purple shoes)匹配你的任何一种模式。第一个 (.*) 匹配模式之前的任何内容。第二个(.*) 匹配模式之后的任何内容。 sub 语句然后将整个字符串替换为模式匹配之后的部分。

【讨论】:

  • 可以简化为:Pat = paste0(".*(", paste0(item, collapse="|"), ")\\s+");sub(Pat, "", item_time)
  • 我收到一条错误消息“模式和替换向量必须是相同的长度”...谢谢!
  • 我没有收到那个错误。哪个语句给了你这个错误?
  • sub(Pat, "\\3", item_time)
  • DT = data.table(time=sub(Pat, "\\2", item_time))
【解决方案2】:

另一种方法是使用 mapply

mapply(gsub,pattern=item,replacement='',x=item_time)

如果您还想删除itemitem_time 右侧部分之间的空格,您可以改用:

mapply(gsub,pattern=paste0(item,' '),replacement='',x=item_time)

【讨论】:

  • 或者trimws(mapply(gsub, item, '', item_time, fixed = TRUE))
【解决方案3】:

这是使用stringr::str_replace(string, pattern, replacement) 的另一个选项,它的优点是它可以在stringpattern(以及replacement)上进行矢量化。

trimws(stringr::str_replace(item_time, item, ""))
#[1] "july noon"               "early september morning"
#[3] "april"                   "february"

trimws 删除前导空格。

请注意,这需要 item_timeitem 具有成对匹配的条目。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    • 2023-01-20
    • 1970-01-01
    相关资源
    最近更新 更多