【问题标题】:removing elements in a vector that contain pure numbers in R删除向量中包含 R 中纯数字的元素
【发布时间】:2018-11-12 01:15:24
【问题描述】:

我有一个包含字符元素的向量,例如

"2-CONTROL", "DAN-COLOR", "3M", "DIPLOMVEJ 373", "ABE 34 HUN"

我想过滤掉字符串中具有独立数字的元素。如果数字附加到字母或连字符,则不应过滤。

上面的向量经过过滤后会得到下面的结果。

"2-CONTROL", "DAN-COLOR", "3M"

我曾尝试在 grepl 中使用 "\\b\\d+\\b",但它也会过滤掉 "2-CONTROL"

【问题讨论】:

    标签: r


    【解决方案1】:

    1) 用 X 替换每个不是数字和空格的字符,然后使用您的正则表达式:

    pat <- "\\b\\d+\\b" # from question
    
    x[!grepl(pat, gsub("[^[:space:][:digit:]]", "X", x))]
    ## [1] "2-CONTROL" "DAN-COLOR" "3M"
    

    2) 另一种可能性是在空白处拆分并拒绝任何包含所有数字的元素。

    x[sapply(strsplit(x, "\\s+"), function(x) !any(grepl("^\\d+$", x)))]
    ## [1] "2-CONTROL" "DAN-COLOR" "3M"  
    

    【讨论】:

      【解决方案2】:

      对于tidyverse 方法,请使用stringr::str_detect()

      library(stringr)
      
      strings <- c("2-CONTROL", "DAN-COLOR", "3M", "DIPLOMVEJ 373", "ABE 34 HUN")
      pattern <- " \\d+ ?" # match free-standing integers
      
      strings[!str_detect(strings, pattern)]
      # [1] "2-CONTROL" "DAN-COLOR" "3M" 
      

      【讨论】:

        【解决方案3】:

        否定逻辑似乎有效:

        regexp <- "\\d{2,}"
        
        x <- c("2-CONTROL", "DAN-COLOR", "3M", "DIPLOMVEJ 373", "ABE 34 HUN")
        res <- x[!grepl(regexp, x)]
        res
        # "2-CONTROL" "DAN-COLOR" "3M"  
        

        【讨论】:

        • 运行第一行时出现以下错误错误:'\d' is an unrecognized escape in string started ""\d" 抱歉,如果评论太愚蠢,但我是新手R
        • 缺少 `` 转义。不知道为什么我第一次尝试时它似乎有效。
        猜你喜欢
        • 2020-09-30
        • 1970-01-01
        • 2014-10-15
        • 1970-01-01
        • 2014-06-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-19
        相关资源
        最近更新 更多