Векторизация заменяет несколько символов с фиксированной позицией в строке на str_sub - PullRequest
1 голос
/ 25 сентября 2019

Я хотел бы заменить каждый 5-й символ в одной строке на *.Вот MWE:

x <- "Mary had a little lamb."
pos <- c(5, 10, 15, 20)

Я бы хотел, чтобы вывод:

[1] "Mary*had * lit*le l*amb."

string::sub_str() мог идентифицировать символы в этих позициях:

> stringr::str_sub(string = x, start = pos, end = pos)
[1] " " "a" "t" "a"

Однако их замена не работает, поскольку sub_str() ожидает, что параметр string будет иметь вектор такой же длины, что и start и end параметры.Не найдя этого, он перезаписывает string для соответствия длине start / end и выполняет одну замену для каждого элемента:

> stringr::str_sub(string = x, start = pos, end = pos) <- "*"
> x
[1] "Mary*had a little lamb." "Mary had * little lamb."
[3] "Mary had a lit*le lamb." "Mary had a little l*mb."

Anyидеи о том, как получить желаемый результат просто, с stringr:sub_str() или без него, но желательно без цикла for?

1 Ответ

1 голос
/ 25 сентября 2019
foo = function(x, pos, rep = "*"){
    tmp = x
    for (i in pos) {
        substr(tmp, i, i) = rep
    }
    tmp
}
foo(x, pos)
#[1] "Mary*had * lit*le l*mb."
...