在 R 中创建单词变体
Create word variations in R
我有一个作业,我完全不知道如何开始让它工作。
我必须创建单词列表的变体,其中每个字符(第一个和最后一个之间)将在不同位置用“*”替换。
它应该看起来像这样:
输入:c('smog', 'sting')
所需输出:'s*og'、'sm*g'、's**g'、's*ing'、'st*ng'、'sti*g'、's***g'
知道如何实现这样的目标吗?
非常感谢
更新
我找到了这个解决方案:
s <- c( 'smog')
f <- function(x,y) {substr(x,y,y) <- "*"; x}
g <- function(x) Reduce(f,x,s)
unlist(lapply(1:(nchar(s)-2),function(x) combn(2:(nchar(s)-1),x,g)))
output:
[1] "s*og" "sm*g" "s**g"
唯一的问题是,它只在字符串中有一个单词时有效,而不是多个单词
另请参阅此 SO post 了解相关技术:
编辑
来自 OP 编辑和评论:
repfun2 <- function(s){
f <- function(x,y) {substr(x,y,y) <- "*"; x}
g <- function(x) Reduce(f,x,s)
out <- unlist(lapply(1:(nchar(s)-2),function(x) combn(2:(nchar(s)-1),x,g)))
return(out)
}
lapply(test2, FUN = repfun2)
输出:
> lapply(test2, FUN = repfun2)
[[1]]
[1] "s*og" "sm*g" "s**g"
[[2]]
[1] "s*ing" "st*ng" "sti*g" "s**ng" "s*i*g" "st**g" "s***g"
上一个答案随机替换
我了解到您想要随机替换字符串向量中的字符。如果这是正确的,这里有一个想法:
test2 <- c('smog', 'sting')
repfun <- function(.string) {
n_char <- nchar(.string)
# random selection of n characters that will be replaced in the string
repchar <- sample(1:n_char, size = sample(1:n_char, size = 1))
# replacing the characters in the string
for(i in seq_along(repchar)) substring(.string, repchar[i], repchar[i]) <- "*"
return(.string)
}
lapply(test2, FUN = repfun)
一些输出:
> lapply(test2, FUN = repfun)
[[1]]
[1] "*mog"
[[2]]
[1] "s*ing"
> lapply(test2, FUN = repfun)
[[1]]
[1] "s*o*"
[[2]]
[1] "s*i*g"
基本思路是:
- 判断一个字符串中的字符个数,
- 根据长度随机采样,
- 将随机抽取的字符替换为“*”
- 使用
lapply
传递字符串向量。
我认为您可以根据需要通过删除 for
循环来改进它,请参阅一些想法 and
我有一个作业,我完全不知道如何开始让它工作。
我必须创建单词列表的变体,其中每个字符(第一个和最后一个之间)将在不同位置用“*”替换。
它应该看起来像这样:
输入:c('smog', 'sting')
所需输出:'s*og'、'sm*g'、's**g'、's*ing'、'st*ng'、'sti*g'、's***g'
知道如何实现这样的目标吗?
非常感谢
更新 我找到了这个解决方案:
s <- c( 'smog')
f <- function(x,y) {substr(x,y,y) <- "*"; x}
g <- function(x) Reduce(f,x,s)
unlist(lapply(1:(nchar(s)-2),function(x) combn(2:(nchar(s)-1),x,g)))
output:
[1] "s*og" "sm*g" "s**g"
唯一的问题是,它只在字符串中有一个单词时有效,而不是多个单词
另请参阅此 SO post 了解相关技术:
编辑
来自 OP 编辑和评论:
repfun2 <- function(s){
f <- function(x,y) {substr(x,y,y) <- "*"; x}
g <- function(x) Reduce(f,x,s)
out <- unlist(lapply(1:(nchar(s)-2),function(x) combn(2:(nchar(s)-1),x,g)))
return(out)
}
lapply(test2, FUN = repfun2)
输出:
> lapply(test2, FUN = repfun2)
[[1]]
[1] "s*og" "sm*g" "s**g"
[[2]]
[1] "s*ing" "st*ng" "sti*g" "s**ng" "s*i*g" "st**g" "s***g"
上一个答案随机替换
我了解到您想要随机替换字符串向量中的字符。如果这是正确的,这里有一个想法:
test2 <- c('smog', 'sting')
repfun <- function(.string) {
n_char <- nchar(.string)
# random selection of n characters that will be replaced in the string
repchar <- sample(1:n_char, size = sample(1:n_char, size = 1))
# replacing the characters in the string
for(i in seq_along(repchar)) substring(.string, repchar[i], repchar[i]) <- "*"
return(.string)
}
lapply(test2, FUN = repfun)
一些输出:
> lapply(test2, FUN = repfun)
[[1]]
[1] "*mog"
[[2]]
[1] "s*ing"
> lapply(test2, FUN = repfun)
[[1]]
[1] "s*o*"
[[2]]
[1] "s*i*g"
基本思路是:
- 判断一个字符串中的字符个数,
- 根据长度随机采样,
- 将随机抽取的字符替换为“*”
- 使用
lapply
传递字符串向量。
我认为您可以根据需要通过删除 for
循环来改进它,请参阅一些想法