【问题标题】:find alphanumeric elements in vector在向量中查找字母数字元素
【发布时间】:2020-03-07 08:16:09
【问题描述】:

我有一个向量

    myVec <- c('1.2','asd','gkd','232','4343','1.3zyz','fva','3213','1232','dasd')

在这个向量中,我想做两件事:

  1. 从同时包含数字和字母的元素中删除所有数字,然后
  2. 如果一组字母后面跟着另一组字母,请将它们合并为一个。

所以上面的向量会是这样的:

'1.2','asdgkd','232','4343','zyzfva','3213','1232','dasd'

我想我会先找到字母数字元素,然后使用 gsub 从它们中删除数字。 我试过这个

    gsub('[0-9]+', '', myVec[grepl("[A-Za-z]+$", myVec, perl = T)])

    "asd"  "gkd"  ".zyz" "fva"  "dasd"

即它保留了我不想要的.

【问题讨论】:

  • 不确定你的意思是行不通的。对于每个包含数字的字符串,即索引 1、4、5、6、8 和 9,我都得到了错误。这不是您对第一步的期望吗?
  • 我假设您的问题是 1.3zyz 未被识别,因此排除在号码删除之外?您断言 start 字母以字符串开头,因此只需从您的通话中删除 ^grepl("[A-Za-z]+$", myVec, perl = T)
  • @camille 我希望代码只为字母数字返回 true,而不是数字或字母
  • 我已经编辑了我的问题以获得清晰的解释
  • 使用gsub('[0-9\\.]+', ' ', myVec[grepl("[A-Za-z]+$", myVec, perl = T)])

标签: r regex grepl


【解决方案1】:

这是我的纯正则表达式解决方案:

myVec <- c('1.2','asd','gkd','232','4343','1.3zyz','fva','3213','1232','dasd')

# find all elemnts containing letters
lettrs = grepl("[A-Za-z]", myVec)

# remove all non-letter characters
myVec[lettrs] = gsub("[^A-Za-z]" ,"", myVec[lettrs])

# paste all elements together, remove delimiter where delimiter is surrounded by letters and split string to new vector
unlist(strsplit(gsub("(?<=[A-Za-z])\\|(?=[A-Za-z])", "", paste(myVec, collapse="|"), perl=TRUE), split="\\|"))

【讨论】:

    【解决方案2】:

    这似乎返回你所追求的

    myVec <- c('1.2','asd','gkd','232','4343','1.3zyz','fva','3213','1232','dasd')
    
    
    clean <- function (x) {
      is_char <- grepl("[[:alpha:]]", x)
      has_number <- grepl("\\d", x)
      mixed <- is_char & has_number
      x[mixed] <- gsub("[\\d\\.]+","", x[mixed], perl=T)
      grp <- cumsum(!is_char | (is_char  & !c(FALSE, head(is_char, -1))))
      unname(tapply(x, grp, paste, collapse=""))
    }
    
    clean(myVec)
    # [1] "1.2"    "asdgkd" "232"    "4343"   "zyzfva" "3213"   "1232"   "dasd" 
    

    在这里,我们查找混合在一起的数字和字母并删除数字。然后我们定义了折叠组,寻找在其他字符之后的字符将它们放在同一个组中。然后我们最终折叠同一组中的所有值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多