【问题标题】:Extract all characters to the left of a list of possible characters提取可能字符列表左侧的所有字符
【发布时间】:2018-08-13 17:57:45
【问题描述】:

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

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

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

【问题讨论】:

    标签: r string extract


    【解决方案1】:

    我们可以在 Base R 中使用strsplit

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

    注意事项:

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

    【讨论】:

    • @IsaNavarro 很高兴我的解决方案有所帮助。随意点击下投票按钮下方的灰色复选标记,接受您认为最有帮助的答案。
    • 后续问题:如果我遇到类似情况但想将所有字符提取到右侧(而不是左侧),代码的哪一部分会发生变化。再次感谢!
    • @IsaNavarro 这有点棘手,因为您想提取最后一个元素。因此,假设右边总是有一些字符串,类似下面的方法会起作用:sapply(strsplit(item_time, split=paste0(time, "\\s", collapse="|")), function(x) x[length(x)]) 你需要决定如果右边(或左边)没有任何东西会发生什么。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      这样做的一种方法是将可能的字符向量制成正则表达式模式,并使用它来提取正确的字符串,如下所示。

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

      请注意,如果time 中的任何选项包含特殊字符,这将失败,如果在item_time 的条目中找不到time 中的任何选项,则会返回NA

      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 年 8 月 13 日创建。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多