我有一个字符串列表:
thzJqGVnDxGzyUPZ8r5z
4JfDZijTxDMKBANKPvw1
t7X5C4Nubv8oGIcPEhIc
ZKwBEZBC5IDfm6atAzTG
gIZRkF6XvlOEI8GI2T8l
我希望从每个字符串中随机抽取十个字符。
例如,输出应该是这样的(注意顺序是不相关的——只要它是一个样本(:
tzJqVDGyZz
fDjTDKAKw1
t7X58oGIhI
ZKwBEatzTG
gIZ8GI2T8l
有没有一种简单的方法可以实现这一点?
注意:不应该有替换(即,一旦选择了字符,就不能替换并再次选择(。
如果字符串包含任何字符的多个实例,则每个字符都应被视为独立的/单独的。
例如:字符串AABBCCDDEE1122334455
可以具有AABB44DD2E
的有效结果。
结果永远不可能是AAABB44DD2
,因为这将包括原始字符串中不存在的附加A
。
您可以使用utf8ToInt
+sample
sapply(s,
function(v) intToUtf8(utf8ToInt(v)[sort(sample(nchar(v), 10))]),
USE.NAMES = FALSE
)
它给出了类似的结果
[1] "hJnDxGzUPr" "ZjTxAKPvw1" "7C4vIcEhIc" "ZKBEZBImtz" "gIRkvlE2T8"
如果你不在乎字符之间保持相同的相对顺序,你可以在上面的代码中省略sort
这里有一种方法:
x <- "dkdkdkdkdkdk"
nums <- sample(1:nchar(x), 10, replace = FALSE)
output <- paste0(strsplit(x, "")[[1]][nums], collapse="")
将单词分成字符,然后制作长度为10的样本并粘贴在一起:
as.character(lapply(strsplit(words,split = ""), function(x) paste0(sample(x, 10, replace = FALSE), collapse = "")))
数据:
words <- c(
"thzJqGVnDxGzyUPZ8r5z",
"4JfDZijTxDMKBANKPvw1",
"t7X5C4Nubv8oGIcPEhIc",
"ZKwBEZBC5IDfm6atAzTG",
"gIZRkF6XvlOEI8GI2T8l")
玩regmatches()
:
sapply(
regmatches(
input,
lapply(
input,
(x) {
output <- sort(sample(seq_len(nchar(x)), 10L))
attr(output, 'match.length') <- rep(1L, 10L)
output
}
)
),
(x) paste(x, collapse = '')
)
# [1] "zJGnxzZ8r5" "fZTDKBNPv1" "tC48ocPhIc" "ZKBEC5fmTG" "gIkFXvOEGl"