我有以下矢量:
words <- c("5lang","kasverschil2","b2b")
我想删除"5"
中的"5lang"
和"2"
中的"kasverschil2"
。但我不想删除"2"
中的"b2b"
。
答案 0 :(得分:11)
gsub("^\\d+|\\d+$", "", words)
#[1] "lang" "kasverschil" "b2b"
另一种选择是使用stringi
library(stringi)
stri_replace_all_regex(words, "^\\d+|\\d+$", "")
#[1] "lang" "kasverschil" "b2b"
使用OP提供的数据集的变体这里是3个主要解决方案的基准(请注意,这些字符串非常短且设计;结果可能在较大的实际数据集上有所不同):
words <- rep(c("5lang","kasverschil2","b2b"), 100000)
library(stringi)
library(microbenchmark)
GSUB <- function() gsub("^\\d+|\\d+$", "", words)
STRINGI <- function() stri_replace_all_regex(words, "^\\d+|\\d+$", "")
GREGEXPR <- function() {
gregexpr(pattern='(^[0-9]+|[0-9]+$)', text = words) -> mm
sapply(regmatches(words, mm, invert=TRUE), paste, collapse="")
}
microbenchmark(
GSUB(),
STRINGI(),
GREGEXPR(),
times=100L
)
## Unit: milliseconds
## expr min lq median uq max neval
## GSUB() 301.0988 349.9952 396.3647 431.6493 632.7568 100
## STRINGI() 465.9099 513.1570 569.1972 629.4176 738.4414 100
## GREGEXPR() 5073.1960 5706.8160 6194.1070 6742.1552 7647.8904 100
答案 1 :(得分:1)
获取数字出现在单词的开头或结尾并与其他所有内容匹配的实例。您需要折叠结果,因为可能存在多个匹配项:
gregexpr(pattern='(^[0-9]+|[0-9]+$)', text = words) -> mm
sapply(regmatches(words, mm, invert=TRUE), paste, collapse="")
答案 2 :(得分:1)
您可以使用使用正则表达式的gsub
:
gsub("^[0-9]|[0-9]$", "", words)
# [1] "lang" "kasverschil" "b2b"
说明:
模式^[0-9]
匹配字符串开头的任何数字,而模式[0-9]$
匹配字符串末尾的任何数字。通过|
分隔这两个模式,你想要匹配第一个或第二个模式。然后,用空字符串替换匹配的模式。