我试着写在R A函数,给定一个向量,最大规模为n,将元素的所有组合返回来自该向量,达到大小n。
例如:
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"
我已经想通了一个不雅的方式来运行combn
每个尺寸可达N,但我似乎无法将结果合并成一个单独的列表。 有什么建议?
试试这个:
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:
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])
不完全是相同的格式,你想要的输出,但也许足够接近?
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"