在向量中查找字母数字元素

find alphanumeric elements in vector

我有一个向量

    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"

即它保留了我不想要的 .

这似乎return你想要的

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" 

在这里我们寻找混合在一起的数字和字母并删除数字。然后我们定义了用于折叠的组,寻找在其他字符之后出现的字符以将它们放在同一组中。然后我们最后把同组的所有值都折叠起来。

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

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="\|"))