首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在向量中查找字母数字元素

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

Stack Overflow用户
提问于 2019-11-11 16:06:22
回答 2查看 173关注 0票数 2

我有一个向量

代码语言:javascript
复制
    myVec <- c('1.2','asd','gkd','232','4343','1.3zyz','fva','3213','1232','dasd')

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

  1. 从包含数字和字母的元素中删除任何数字,然后,如果一组字母后面跟着另一组字母,则将它们合并为一个字母组

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

代码语言:javascript
复制
'1.2','asdgkd','232','4343','zyzfva','3213','1232','dasd'

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

代码语言:javascript
复制
    gsub('[0-9]+', '', myVec[grepl("[A-Za-z]+$", myVec, perl = T)])

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

也就是说,它保留了我不想要的.

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-11 16:35:58

这似乎还你想要的东西

代码语言:javascript
复制
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" 

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

票数 5
EN

Stack Overflow用户

发布于 2019-11-12 08:13:18

这里是我的regex唯一解决方案:

代码语言:javascript
复制
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="\\|"))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58804816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档