假设一个向量:
xx.1 <- c("zz_ZZ_uu_d", "II_OO_d")
我想从最右边拆分一个新矢量,并且只拆分一次。预期结果将是:
c("zz_ZZ_uu", "d", "II_OO", "d").
就像python的rsplit()
功能一样。我现在的想法是扭转字符串,并与分裂str_split()
在stringr
。
有更好的解决方案吗?
更新
这是我的解决方案返回n拆分,具体取决于stringr和stringi。有人提供具有基本功能的版本会很好。
rsplit <- function (x, s, n) {
cc1 <- unlist(stringr::str_split(stringi::stri_reverse(x), s, n))
cc2 <- rev(purrr::map_chr(cc1, stringi::stri_reverse))
return(cc2)
}
负前瞻:
unlist(strsplit(xx.1, "_(?!.*_)", perl = TRUE))
# [1] "zz_ZZ_uu" "d" "II_OO" "d"
哪里a(?!b)
说找到这样一个a
,后面没有一个b
。在这种情况下.*_
,无论多远(.*
)都不应再有_
。
但是,推广这种想法似乎并不容易。首先,请注意,可以使用来将其重写为正向_(?=[^_]*$)
(查找,_
后跟除以外的任何字符_
,这里$
表示字符串的结尾)。那么一个不太优雅的概括是
rsplit <- function(x, s, n) {
p <- paste0("[^", s, "]*")
rx <- paste0(s, "(?=", paste(rep(paste0(p, s), n - 1), collapse = ""), p, "$)")
unlist(strsplit(x, rx, perl = TRUE))
}
rsplit(vec, "_", 1)
# [1] "a_b_c_d_e_f" "g" "a" "b"
rsplit(vec, "_", 3)
# [1] "a_b_c_d" "e_f_g" "a_b"
例如,如果n=3
此函数使用_(?=[^_]*_[^_]*_[^_]*$)
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句