R - 随机替换

时间:2017-09-08 15:45:11

标签: r

R中的sub函数正在替换模式的 first occurence

示例:

> s <- "my name is sam"
> sub(" ","*",s)
[1] "my*name is sam"

然而,在三个空格(“”)的随机位置有一种简单的替换方法:

"my*name is sam"
"my name is*sam"
"my name*is sam"

3 个答案:

答案 0 :(得分:1)

以下提供了可能的解决方案。简而言之,您可以在找到空格时分割您的句子。您使用sample()选择一个随机位置,然后用您选择的字符(*)替换相应的空格。 最后,将所有内容粘贴在一起。

s <- "my name is sam"

# get your words
elems <- strsplit(s, " ")[[1]]

# recreate the spaces between words. Add an extra "" to add after the last word 
spacer <- c(rep(" ", (length(elems)-1)), "") 

# pick a random 'space' and replace it to *
pos <- sample(1:(length(elems)-1), size = 1)
spacer[pos] <- "*"

# paste everything together
result <- paste(paste(elems, spacer, sep = "", collapse = ""), sep = "", collapse = "")

结果

result
"my name*is sam"

再次运行相同的几行,采样是随机的,所以你应该得到所有三个可能的结果......

答案 1 :(得分:1)

使用stringr

library(stringr)
s <- "my name is sam"
index <- sample(str_locate_all(s, " ")[[1]][,1], 1)
str_sub(s, index, index) <- "*"

答案 2 :(得分:0)

另一种解决方案。计算空白并选择一个随机替换。然后根据随机选择的点构建正则表达式。此代码使用stringr包中的str_count

library(stringr)
position = sample(1:str_count(s, ' '), 1) - 1
pattern = paste0("((\\S*\\s){", position, "}\\S*)\\s")
sub(pattern, "\\1*", s)

关于正则表达式的说明。它会跳过第一个position空白(以及所有非空白)以替换随机选择的空白。