各种尺寸的所有组合?

时间:2013-07-23 18:14:12

标签: r combinations

当我搜索“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

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

谢谢!

2 个答案:

答案 0 :(得分:5)

如果您更喜欢紧凑型代码

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

答案 1 :(得分:2)

combn结合使用lapply可能会有所帮助:

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指出的那样,simplify还有一个combn参数,设置为FALSE时会创建嵌套的list个列向量,而不是matrix所有结果。例如,如果您使用[[3]],则代替上面的列表项matrix,如果您使用lapply(seq_along(x), function(y) combn(x, y)),则可以获得长度为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