在向量中查找字母数字元素
find alphanumeric elements in vector
我有一个向量
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"
即它保留了我不想要的 .
。
这似乎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="\|"))
我有一个向量
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"
即它保留了我不想要的 .
。
这似乎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="\|"))