【问题标题】:listing all subsets of a vector for a given size列出给定大小的向量的所有子集
【发布时间】:2014-06-28 10:50:25
【问题描述】:

函数choose(n,k) 告诉我们对于一组n 不同元素存在多少大小为k 的子集。假设我需要实际列出这些子集,我如何创建它?换句话说,我正在寻找一个函数,它接受一个向量x(长度为n)和一个数字k,并返回一个向量列表,每个向量的大小为k,子集为x .列表的长度当然应该是choose(length(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)。检查? combn 以获取文档。
  • 为什么不回答这个问题?
  • @Ramnath 谢谢。这正是我想要的。

标签: r list subset enumerate


【解决方案1】:

编辑


我意识到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])
  }
}

测试运行:

> 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多