【发布时间】:2016-01-31 11:55:53
【问题描述】:
我可以从字符串中删除最后一个字符:
listfruit <- c("aapplea","bbananab","oranggeo")
gsub('.{1}$', '', listfruit)
但我在尝试从字符串中删除第一个字符时遇到问题。 还有第一个和最后一个字符。 非常感谢您的帮助。
【问题讨论】:
我可以从字符串中删除最后一个字符:
listfruit <- c("aapplea","bbananab","oranggeo")
gsub('.{1}$', '', listfruit)
但我在尝试从字符串中删除第一个字符时遇到问题。 还有第一个和最后一个字符。 非常感谢您的帮助。
【问题讨论】:
如果我们需要去掉第一个字符,使用sub,匹配一个字符(.代表单个字符),替换成''。
sub('.', '', listfruit)
#[1] "applea" "bananab" "ranggeo"
或者对于第一个和最后一个字符,匹配字符串开头(^.)或字符串结尾(.$)的字符,并替换为''。
gsub('^.|.$', '', listfruit)
#[1] "apple" "banana" "rangge"
我们还可以将其捕获为一个组并替换为反向引用。
sub('^.(.*).$', '\\1', listfruit)
#[1] "apple" "banana" "rangge"
另一个选项是substr
substr(listfruit, 2, nchar(listfruit)-1)
#[1] "apple" "banana" "rangge"
【讨论】:
library(stringr)
str_sub(listfruit, 2, -2)
#[1] "apple" "banana" "rangge"
删除第一个和最后一个字符。
【讨论】:
对我来说,性能很重要,所以我使用可用的解决方案运行了一个快速基准测试。
library(magrittr)
comb_letters = combn(letters,5) %>% apply(2, paste0,collapse = "")
bench::mark(
gsub = {gsub(pattern = '^.|.$',replacement = '',x = comb_letters)},
substr = {substr(comb_letters,start = 2,stop = nchar(comb_letters) - 1)},
str_sub = {stringr::str_sub(comb_letters,start = 2,end = -2)}
)
#> # A tibble: 3 x 6
#> expression min median `itr/sec` mem_alloc `gc/sec`
#> <bch:expr> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl>
#> 1 gsub 32.9ms 33.7ms 29.7 513.95KB 0
#> 2 substr 15.07ms 15.84ms 62.7 1.51MB 2.09
#> 3 str_sub 5.08ms 5.36ms 177. 529.34KB 2.06
由reprex package (v0.3.0) 于 2019 年 12 月 30 日创建
【讨论】:
stringr 包时遇到问题,请改用stringi::stri_sub。