当我搜索“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
希望代码可以推广,这样一旦我有一个更大的向量,它就可以推广。
谢谢!
答案 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