从向量 R 创建所有可能的字符串
Create all possible strings from a vector R
我有一个包含四个字母的向量。
letter <- c('x', 'y', 'z', 'j')
我想创建所有可能的由 20 个字母组成的字符串,重复我的四个字母。
我尝试使用 combn()
和 random
包但我失败了。
首先,您应该意识到您的计算机可能无法容纳那么多的字符串(所有 20 个字母的组合),例如,
> rep(strrep("a", 20), 4^20)
Error: cannot allocate vector of size 8192.0 Gb
然而,如果我们有较短的字符串,似乎仍然可以这样做。
这里有几个可以产生所有组合的基础 R 选项
f1 <- function(n) {
if (n == 1) {
return(letter)
}
v <- Recall(n - 1)
unlist(lapply(letter, paste0, v))
}
f2 <- function(n) {
v <- letter
for (k in 2:n) {
v <- unlist(lapply(letter, paste0, v))
}
v
}
f3 <- function(n) {
lst <- rep(list(letter), n)
Reduce(function(x, y) do.call(paste0, expand.grid(x, y)), lst)
}
f4 <- function(n) {
do.call(paste0, expand.grid(rep(list(letter), n)))
}
速度基准测试是
> n <- 10
> microbenchmark(
+ f1(n),
+ f2(n),
+ f3(n),
+ f4(n),
+ times = 10L
+ )
Unit: milliseconds
expr min lq mean median uq max neval
f1(n) 434.0156 592.1137 650.2692 617.9684 688.4830 903.9767 10
f2(n) 461.7505 604.7973 749.9571 725.1946 969.3452 1097.1925 10
f3(n) 1086.2451 1458.1349 1615.1434 1585.8263 1661.5754 2105.3784 10
f4(n) 1780.0759 1926.0896 2192.6231 2256.5225 2288.2689 2703.9856 10
我有一个包含四个字母的向量。
letter <- c('x', 'y', 'z', 'j')
我想创建所有可能的由 20 个字母组成的字符串,重复我的四个字母。
我尝试使用 combn()
和 random
包但我失败了。
首先,您应该意识到您的计算机可能无法容纳那么多的字符串(所有 20 个字母的组合),例如,
> rep(strrep("a", 20), 4^20)
Error: cannot allocate vector of size 8192.0 Gb
然而,如果我们有较短的字符串,似乎仍然可以这样做。
这里有几个可以产生所有组合的基础 R 选项
f1 <- function(n) {
if (n == 1) {
return(letter)
}
v <- Recall(n - 1)
unlist(lapply(letter, paste0, v))
}
f2 <- function(n) {
v <- letter
for (k in 2:n) {
v <- unlist(lapply(letter, paste0, v))
}
v
}
f3 <- function(n) {
lst <- rep(list(letter), n)
Reduce(function(x, y) do.call(paste0, expand.grid(x, y)), lst)
}
f4 <- function(n) {
do.call(paste0, expand.grid(rep(list(letter), n)))
}
速度基准测试是
> n <- 10
> microbenchmark(
+ f1(n),
+ f2(n),
+ f3(n),
+ f4(n),
+ times = 10L
+ )
Unit: milliseconds
expr min lq mean median uq max neval
f1(n) 434.0156 592.1137 650.2692 617.9684 688.4830 903.9767 10
f2(n) 461.7505 604.7973 749.9571 725.1946 969.3452 1097.1925 10
f3(n) 1086.2451 1458.1349 1615.1434 1585.8263 1661.5754 2105.3784 10
f4(n) 1780.0759 1926.0896 2192.6231 2256.5225 2288.2689 2703.9856 10