从向量 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