R 列出给定大小的向量的所有子集
函数R 列出给定大小的向量的所有子集,r,list,subset,enumerate,R,List,Subset,Enumerate,函数choose(n,k)告诉我们对于一组n不同的元素,有多少个大小为k的子集。假设我需要实际列出这些子集,我如何创建它?换句话说,我正在寻找一个函数,它接受一个向量x(长度n)和一个数字k,并返回一个向量列表,每个向量的大小k,以及x的子集。当然,列表的长度应该是choose(长度(x),k)。比如说 enum.choose = function(x,k) { # implementation should go here { enum.choose(1:3,2) # should
choose(n,k)
告诉我们对于一组n
不同的元素,有多少个大小为k
的子集。假设我需要实际列出这些子集,我如何创建它?换句话说,我正在寻找一个函数,它接受一个向量x
(长度n
)和一个数字k
,并返回一个向量列表,每个向量的大小k
,以及x
的子集。当然,列表的长度应该是choose(长度(x),k)
。比如说
enum.choose = function(x,k) {
# implementation should go here
{
enum.choose(1:3,2)
# should be:
# [[1]]
# 1 2
# [[2]]
# 1 3
# [[3]]
# 2 3
编辑
我意识到
combn(1:3,2,simplify=FALSE)
提供了您要查找的列表结果。如果@Ramnath希望发布答案,此答案将被删除
> combn(1:3, 2, simplify = FALSE)
## [[1]]
## [1] 1 2
## [[2]]
## [1] 1 3
## [[3]]
## [1] 2 3
因此,对其使用*apply
函数将使以下函数不相关
原创
利用@Ramnath的注释,您的函数可能如下所示:
enum.choose <- function(x, k) {
if(k > length(x)) stop('k > length(x)')
if(choose(length(x), k)==1){
list(as.vector(combn(x, k)))
} else {
cbn <- combn(x, k)
lapply(seq(ncol(cbn)), function(i) cbn[,i])
}
}
combn(1:3,2)
。检查?combn
获取文档。为什么不回答这个问题?@Ramnath谢谢。这正是我想要的。
> enum.choose(1:3, 2)
# [[1]]
# [1] 1 2
#
# [[2]]
# [1] 1 3
#
# [[3]]
# [1] 2 3
> enum.choose(c(1, 2, 5, 4), 3)
# [[1]]
# [1] 1 2 5
#
# [[2]]
# [1] 1 2 4
#
# [[3]]
# [1] 1 5 4
#
# [[4]]
# [1] 2 5 4
> enum.choose(1:4, 4)
# [[1]]
# [1] 1 2 3 4
> enum.choose(1:5, 6)
# Error in enum.choose(1:5, 6) : k > length(x)