【问题标题】:All combinations of all sizes?所有尺寸的所有组合?
【发布时间】:2013-07-23 18:14:12
【问题描述】:

当我搜索“R 中的向量组合”时,SO 上有数千个结果,但我找不到我的问题的答案。如有重复请见谅:

我有一个向量(1,2,3,4),我想找到所有组合(n 选择 2)到(n 选择 n)。换句话说,对于这个向量,我想要:

1,2,3,4
1,2,3
1,2,4
1,3,4
2,3,4
1,2
1,3
1,4
2,3
2,4
3,4

希望代码可以泛化,这样一旦我有一个更大的向量,它就可以泛化。

谢谢!

【问题讨论】:

  • 看一下“combn”函数。应该做你需要的。
  • x <- 1:4试试lapply(2:length(x), function(n) combn(x = x, m = n))
  • dickoa,你非常接近,你也复制了我之前得到的结果。不过,有没有办法摆脱这些额外的重复? (x 选择 2 得到 1,1,1,2...有没有办法只得到 1,2)?

标签: r combinations


【解决方案1】:

如果你喜欢简洁的代码

Map(combn, list(x), seq_along(x))
## [[1]]
##      [,1] [,2] [,3] [,4]
## [1,]    1    2    3    4

## [[2]]
##      [,1] [,2] [,3] [,4] [,5] [,6]
## [1,]    1    1    1    2    2    3
## [2,]    2    3    4    3    4    4

## [[3]]
##      [,1] [,2] [,3] [,4]
## [1,]    1    1    1    2
## [2,]    2    2    3    3
## [3,]    3    4    4    4

## [[4]]
##      [,1]
## [1,]    1
## [2,]    2
## [3,]    3
## [4,]    4

为避免重复,您必须处理嵌套列表,但您可以使用 unlist 简化结果

res <- Map(combn, list(x), seq_along(x), simplify = FALSE)
unlist(res, recursive = FALSE)
## [[1]]
## [1] 1

## [[2]]
## [1] 2

## [[3]]
## [1] 3

## [[4]]
## [1] 4

## [[5]]
## [1] 1 2

## [[6]]
## [1] 1 3

## [[7]]
## [1] 1 4

## [[8]]
## [1] 2 3

## [[9]]
## [1] 2 4

## [[10]]
## [1] 3 4

## [[11]]
## [1] 1 2 3

## [[12]]
## [1] 1 2 4

## [[13]]
## [1] 1 3 4

## [[14]]
## [1] 2 3 4

## [[15]]
## [1] 1 2 3 4

【讨论】:

    【解决方案2】:

    也许combnlapply 结合使用可能会有所帮助:

    x <- 1:4
    lapply(seq_along(x), function(y) combn(x, y))
    # [[1]]
    #      [,1] [,2] [,3] [,4]
    # [1,]    1    2    3    4
    # 
    # [[2]]
    #      [,1] [,2] [,3] [,4] [,5] [,6]
    # [1,]    1    1    1    2    2    3
    # [2,]    2    3    4    3    4    4
    # 
    # [[3]]
    #      [,1] [,2] [,3] [,4]
    # [1,]    1    1    1    2
    # [2,]    2    2    3    3
    # [3,]    3    4    4    4
    # 
    # [[4]]
    #      [,1]
    # [1,]    1
    # [2,]    2
    # [3,]    3
    # [4,]    4
    

    正如@Roland 指出的那样,combn 还有一个simplify 参数,当设置为FALSE 时,将创建一个嵌套的list,而不是所有结果的matrix。例如,如果您使用 lapply(seq_along(x), function(y) combn(x, y)),而不是将上面的列表项 [[3]] 显示为 matrix,则对于长度为 3 的组合,您将得到:

    # [[3]]
    # [[3]][[1]]
    # [1] 1 2 3
    # 
    # [[3]][[2]]
    # [1] 1 2 4
    # 
    # [[3]][[3]]
    # [1] 1 3 4
    # 
    # [[3]][[4]]
    # [1] 2 3 4
    

    【讨论】:

    • 他们可能更喜欢simplify=FALSE
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多