5

データ、文字ベクトル (最終的には折りたたむので、ベクトルのままか、単一の文字列として扱われるかは気にしません)、パターンのベクトル、置換のベクトルがあります。データ内の各パターンをそれぞれの置換で置き換えたい。私はそれを astringrと for ループでやり遂げましたが、それを行うためのもっと R のような方法はありますか?

require(stringr)
start_string <- sample(letters[1:10], 10)
my_pattern <- c("a", "b", "c", "z")
my_replacement <- c("[this was an a]", "[this was a b]", "[this was a c]", "[no z!]")
str_replace(start_string, pattern = my_pattern, replacement = my_replacement)
# bad lengths, doesn't work

str_replace(paste0(start_string, collapse = ""),
    pattern = my_pattern, replacement = my_replacement)
# vector output, not what I want in this case

my_result <- start_string
for (i in 1:length(my_pattern)) {
    my_result <- str_replace(my_result,
        pattern = my_pattern[i], replacement = my_replacement[i])
}
> my_result
 [1] "[this was a c]"  "[this was an a]" "e"               "g"               "h"               "[this was a b]" 
 [7] "d"               "j"               "f"               "i"   

# This is what I want, but is there a better way?

私の場合、各パターンが最大 1 回発生することはわかっていますが、すべてのパターンが発生するわけではありません。str_replace_allパターンが複数回発生する可能性がある場合に使用できることはわかっています。ソリューションがそのオプションも提供することを願っています。my_patternまた、 andを使用しmy_replacementて、これらのベクトルを引数として持つ関数の一部にすることができるソリューションも必要です。

4

2 に答える 2

1

gregrexprregmatches、およびに基づくオプションを次に示しますregmatches<-。一致できる正規表現の長さには制限があることに注意してください。したがって、あまりにも多くの長いパターンを一致させようとすると、これは機能しません。

replaceSubstrings <- function(patterns, replacements, X) {
    pat <- paste(patterns, collapse="|")
    m <- gregexpr(pat, X)
    regmatches(X, m) <- 
        lapply(regmatches(X,m),
               function(XX) replacements[match(XX, patterns)])
    X
}

## Try it out
patterns <- c("cat", "dog")
replacements <- c("tiger", "coyote")
sentences <- c("A cat", "Two dogs", "Raining cats and dogs")
replaceSubstrings(patterns, replacements, sentences)
## [1] "A tiger"                    "Two coyotes"               
## [3] "Raining tigers and coyotes"
于 2013-02-15T23:39:03.080 に答える