【问题标题】:Is there a way to selectively apply this stringr function?有没有办法选择性地应用这个 stringr 函数?
【发布时间】:2020-07-31 03:15:06
【问题描述】:

我有一个 的用户,其中一列包含他们自我报告的位置。因此,报告的某些位置是无意义的,但在将此列与已知位置的其他列匹配时可能会导致误报。以下是数据框的示例。

data <- data.frame(X = (1:5), Y = c("", "Washington, DC", "Huntsville, AL", "Mobile,AL", "ALL OVER"))

有了这些数据,然后我运行下面的代码来建立与AL 的匹配。

library(stringr)
data$match_ab <- str_extract(data[,2], str_c("AL", collapse = "|"))

这会导致 Huntsville 和 Mobile 被正确识别为正数,但由于字符串中的 ALALL OVER 的第三个匹配项错误地识别为匹配项。

有没有办法调整这个脚本,以便它检测s 中的匹配项,同时忽略在字符串的所需部分附加了字母的字符串?换句话说,这是否可以检测到AL,而部分字符串的任一侧可能存在空格或标点符号,而如果字母字母与字符串相邻,则忽略匹配?

提前致谢。

【问题讨论】:

    标签: dataframe string r data-manipulation stringr


    【解决方案1】:

    如果我理解正确的话,这对你有用吗:

    data$match_ab <- str_extract(data[,2], "\\bAL\\b")
    

    使用\\b 这是一个边界条件,因此如果它后面/前面有一个单词,则它不匹配任何内容或根据文档:符号 \b 匹配 a 任一边缘的空字符串单词

    【讨论】:

      【解决方案2】:

      对特定位置的匹配稍作调整:在您的search_item 之后添加$,这是一个,它指定:如果它只出现在字符串的末尾,则需要匹配。

      data$match_ab <- str_extract(data[,2], str_c("AL$", collapse = "|")); data;
      
        X              Y match_ab
      1 1                    <NA>
      2 2 Washington, DC     <NA>
      3 3 Huntsville, AL       AL
      4 4      Mobile,AL       AL
      5 5       ALL OVER     <NA>
      

      假设 AL 在字符串的中间,那么这可能更通用:

      data <- data.frame(X = (1:5), Y = c("", "Washington, DC", "Huntsville, AL, 
                         SOMETHING_AT_THE_END", "Mobile,AL", "ALL OVER")); data;
        X                                    Y
      1 1                                     
      2 2                       Washington, DC
      3 3 Huntsville, AL, SOMETHING_AT_THE_END
      4 4                            Mobile,AL
      5 5                             ALL OVER
      
      data$match_ab <- str_extract(data[,2], str_c("AL(?!L)", collapse = "|")); data;
        X                                    Y match_ab
      1 1                                          <NA>
      2 2                       Washington, DC     <NA>
      3 3 Huntsville, AL, SOMETHING_AT_THE_END       AL
      4 4                            Mobile,AL       AL
      5 5                             ALL OVER     <NA>
      

      其中(?!L) 表示不是!,后跟? L

      【讨论】:

        【解决方案3】:

        我们也可以使用stringi中的stri_extract

        library(stringi)
        data$match_ab <- stri_extract(data[,2], regex = "\\bAL\\b") 
        

        【讨论】:

          猜你喜欢
          • 2021-03-09
          • 2019-09-10
          • 2023-03-03
          • 1970-01-01
          • 1970-01-01
          • 2021-06-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多