Другой подход, использующий strsplit
:
tl <- lapply(text, function(s) strsplit(s, split = " ")[[1]])
df <- stack(setNames(tl, seq_along(tl)))
ix <- df$values == "change"
df[ix, "values"] <- new
tapply(df$values, df$ind, paste, collapse = " ")
, который дает:
1
"TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT one"
2
"TEXT TEXT TEXT two TEXT TEXT TEXT TEXT TEXT three"
3
"TEXT TEXT TEXT four TEXT TEXT TEXT TEXT"
Кроме того, вы можете заключить вызов tapply
в unname
:
unname(tapply(df$values, df$ind, paste, collapse = " "))
, что дает:
[1] "TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT one"
[2] "TEXT TEXT TEXT two TEXT TEXT TEXT TEXT TEXT three"
[3] "TEXT TEXT TEXT four TEXT TEXT TEXT TEXT"
Если вы хотите использовать элементы new
только один раз, вы можете обновить кодto:
newnew <- new[1:3]
ix <- df$values == "change"
df[ix, "values"][1:length(newnew)] <- newnew
unname(tapply(df$values, df$ind, paste, collapse = " "))
Вы можете изменить это далее, чтобы также учесть ситуацию, когда существует больше замен, чем позиций (вхождения шаблона, change
в примере), которые должны бытьзаменено:
newnew2 <- c(new, "five")
tl <- lapply(text, function(s) strsplit(s, split = " ")[[1]])
df <- stack(setNames(tl, seq_along(tl)))
ix <- df$values == "change"
df[ix, "values"][1:pmin(sum(ix),length(newnew2))] <- newnew2[1:pmin(sum(ix),length(newnew2))]
unname(tapply(df$values, df$ind, paste, collapse = " "))