2

私はいくつかの文字列を持っています

string <- "abbccc"

同じ文字のチェーンを、この文字の出現回数と 1 文字だけに置き換えたいと考えています。だから私はこのようなものが欲しい: "ab2c3"

これを行うためにパッケージを使用stringiしますが、思い通りに動作しません。交換用のパーツを含むベクターが既にあるとしましょう。

vector <- c("b2", "c3")
stri_replace_all_regex(string, "([a-z])\\1{1,8}", vector)

出力:

[1] "ab2b2" "ac3c3"

私が望む出力:[1] "ab2c3"

私もこの方法を試しました

stri_replace_all_regex(string, "([a-z])\\1{1,8}", vector, vectorize_all=FALSE)

しかし、私はエラーが発生します

Error in stri_replace_all_regex(string, "([a-z])\\1{1,8}", vector, vectorize_all = FALSE) : 
  vector length not consistent with other arguments
4

2 に答える 2

5

正規表現ではなく、いくつかの魔法を使ったstrsplitand :rlepaste

string <- c("abbccc", "bbaccc", "uffff", "aaabccccddd")

sapply(lapply(strsplit(string, ""), rle), function(x) {
    paste(x[[2]], ifelse(x[[1]] == 1, "", x[[1]]), sep="", collapse="")
})

## [1] "ab2c3"   "b2ac3"   "uf4"     "a3bc4d3"
于 2014-11-29T21:40:35.697 に答える
3

stringi解決策でも解決策でもありませんがregex、文字列を分割して次を使用することで実行できますrle

    string <- "abbccc"
    res<-paste(collapse="",do.call(paste0,rle(strsplit(string,"",fixed=TRUE)[[1]])[2:1]))
    gsub("1","",res)
    #[1] "ab2c3"
于 2014-11-29T17:50:26.210 に答える