获取R中数字序列的所有拆分

use*_*349 4 recursion r list vector sequence

我试图[1:n]在REg 中获得序列的所有可能的分裂:

getSplits(0,3)
Run Code Online (Sandbox Code Playgroud)

应该返回序列123的所有可能的分裂,换句话说(在向量列表中):

[1] 1
[2] 1 2
[3] 1 2 3
[4] 1 3
[5] 2
[6] 2 3
[7] 3
Run Code Online (Sandbox Code Playgroud)

现在我已经创建了一个函数,它可以递归地获取这些向量,但是无法将它们组合成一个如上所述.我的功能是:

getSplits <- function(currentDigit, lastDigit, split) {
  splits=list();
  for (nextDigit in currentDigit: lastDigit)
  {
    currentSplit <- c(split, c(nextDigit));
    print(currentSplit);
    if(nextDigit < lastDigit) {
      possibleSplits = c(list(currentSplit), getSplits(nextDigit+1, lastDigit, currentSplit));
    }else{
      possibleSplits = currentSplit;
    }
    splits <- c(splits, list(possibleSplits));
  }
  return(splits);
} 
Run Code Online (Sandbox Code Playgroud)

打印每个currentSplit导致我需要的所有正确向量,但不知何故最终返回列表(拆分)将它们嵌入到更深层次的列表中,返回:

[1] 1

[[1]][[2]]
[[1]][[2]][[1]]
[1] 1 2

[[1]][[2]][[2]]
[1] 1 2 3


[[1]][[3]]
[1] 1 3


[[2]]
[[2]][[1]]
[1] 2

[[2]][[2]]
[1] 2 3


[[3]]
[1] 3
Run Code Online (Sandbox Code Playgroud)

用于相应的函数调用getSplits(1, 3, c()).

如果有人能按照我上面描述的方式帮助我完成这项工作,我们将不胜感激!

G. *_*eck 6

字符向量输出

试试combn:

k <- 3
s <- unlist(lapply(1:k, combn, x = k, toString))
s
## [1] "1"       "2"       "3"       "1, 2"    "1, 3"    "2, 3"    "1, 2, 3"
Run Code Online (Sandbox Code Playgroud)

数据帧输出

如果您希望输出采用数据框的形式:

read.table(text = s, header = FALSE, sep = ",", fill = TRUE, col.names = 1:k)
Run Code Online (Sandbox Code Playgroud)

赠送:

  X1 X2 X3
1  1 NA NA
2  2 NA NA
3  3 NA NA
4  1  2 NA
5  1  3 NA
6  2  3 NA
7  1  2  3
Run Code Online (Sandbox Code Playgroud)

列表输出

或列表:

lapply(s, function(x) scan(textConnection(x), quiet = TRUE, sep = ","))
Run Code Online (Sandbox Code Playgroud)

赠送:

[[1]]
[1] 1

[[2]]
[1] 2

[[3]]
[1] 3

[[4]]
[1] 1 2

[[5]]
[1] 1 3

[[6]]
[1] 2 3

[[7]]
[1] 1 2 3
Run Code Online (Sandbox Code Playgroud)

更新:已纳入评论中提到的改进以及进一步的简化,并添加了数据框和列表输出.