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()).
如果有人能按照我上面描述的方式帮助我完成这项工作,我们将不胜感激!
试试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)
更新:已纳入评论中提到的改进以及进一步的简化,并添加了数据框和列表输出.