我有一个向量
myVec <- c('1.2','asd','gkd','232','4343','1.3zyz','fva','3213','1232','dasd')在这个向量中,我想做两件事:
所以上面的向量会是这样的:
'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"也就是说,它保留了我不想要的.。
发布于 2019-11-11 16:35:58
这似乎还你想要的东西
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" 在这里,我们寻找数字和字母混合在一起,并删除数字。然后,我们定义组来折叠,寻找在其他字符之后出现的字符,将它们放在同一个组中。然后,我们最终将同一组中的所有值折叠起来。
发布于 2019-11-12 08:13:18
这里是我的regex唯一解决方案:
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="\\|"))https://stackoverflow.com/questions/58804816
复制相似问题