6

我有以下字符串:

string <- c("100 this is 100 test 100 string")

我想用另一个向量的元素替换上面字符串中的 100:

replacement <- c(1000,2000,3000)

字符串的前 100 应替换为 1000,第二个 100 应替换为 2000,依此类推。生成的字符串应如下所示:

result <- c("1000 this is 2000 test 3000 string")

在 R 中有没有一种有效的方法来做到这一点?

谢谢你。

拉维

4

6 回答 6

3

单程:

> cs <- strsplit(string," ")[[1]]
> cs[cs == "100"] <- replacement
> cat(cs)
1000 this is 2000 test 3000 string
于 2013-04-18T12:08:21.610 回答
2

不是很优雅,但这应该可以..

string <- c("100 this is 100 test 100 string")
temp <- unlist(strsplit(string, split = "\\s+"))
replacement <- c(1000, 2000, 3000)
temp[temp == "100"] <- replacement
result <- paste(temp, collapse = " ")

result
## [1] "1000 this is 2000 test 3000 string"
于 2013-04-18T11:51:06.350 回答
2

另一种方式(需要更改replacement为列表):

string <- c("100 this is 100 test 100 string")
replacement <- list(1000, 2000, 3000)
result <- do.call(sprintf, c(gsub('100', '%d', string), replacement))
于 2013-04-18T14:31:55.923 回答
2

派对迟到了,但regmatches有一个regmatches(...) <- value分配功能,可以让你在一个班轮中干净地做这种事情:

regmatches(string, gregexpr("100",string)) <- list(replacement)
string
# [1] "1000 this is 2000 test 3000 string"

如果您不想覆盖原来的string,您可以通过以下方式直接调用该函数:

`regmatches<-`(string, gregexpr("100",string), value=list(replacement))
#[1] "1000 this is 2000 test 3000 string"
于 2013-08-08T01:24:52.743 回答
1

这是一种方法strsplit

split <- unlist(strsplit(string, "100", fixed=TRUE))
split <- split[nchar(split) > 0]
paste0(replacement, split, collapse="")
# [1] "1000 this is 2000 test 3000 string"

第二行在这里是因为strsplit在其结果的开头添加了一个空字符串,因为100出现在第一个位置。

于 2013-04-18T11:52:48.973 回答
0

如何使用sub*apply

tail(sapply(replacement, function(x) {string <<- sub("\\b100\\b",x,string)}), 1)
于 2013-04-18T14:19:41.530 回答