我正在尝试在R中编写一个函数,给定一个向量和最大大小为n,将返回该向量中元素的所有组合,最大为n。
E.g:
multi_combn(LETTERS[1:3], 2)
会屈服:
[[1]]
[1] "A"
[[2]]
[1] "B"
[[3]]
[1] "C"
[[4]]
[1] "A" "B"
[[5]]
[1] "A" "C"
[[6]]
[1] "B" "C"
我已经找到了为每个大小到n运行combn
的不雅方式,但我似乎无法将结果合并到一个列表中。有什么建议吗?
答案 0 :(得分:11)
试试这个:
multi_combn <- function(dat, n) {
unlist(lapply(1:n, function(x) combn(dat, x, simplify=F)), recursive=F)
}
返回
> multi_combn(LETTERS[1:3], 2)
[[1]]
[1] "A"
[[2]]
[1] "B"
[[3]]
[1] "C"
[[4]]
[1] "A" "B"
[[5]]
[1] "A" "C"
[[6]]
[1] "B" "C"
答案 1 :(得分:5)
只是为了好玩,这里有几种完全不同的方法:
备选方案1:
multi_combn <- function(X) {
ii <- do.call(expand.grid,
replicate(length(X), c(FALSE, TRUE), simplify=FALSE))[-1,]
apply(ii, 1, function(i) X[i])
}
multi_combn(LETTERS[1:3])
备选方案2:(我通常不喜欢混淆代码,但此功能是一个例外。)
multi_combn <- function(X) {
sapply(seq_len(2^(length(X)) - 1),
FUN = function(n) {
X[as.logical(rawToBits(as.raw(n)))]
})
}
multi_combn(LETTERS[1:3])
答案 2 :(得分:2)
与您想要的输出格式不完全相同,但可能足够接近?
multi_combn <- function(dat, n) {
lapply(seq_len(n), function(x) t(combn(dat, x)))
}
> dat <- LETTERS[1:3]
> multi_combn(dat,3)
[[1]]
[,1]
[1,] "A"
[2,] "B"
[3,] "C"
[[2]]
[,1] [,2]
[1,] "A" "B"
[2,] "A" "C"
[3,] "B" "C"
[[3]]
[,1] [,2] [,3]
[1,] "A" "B" "C"