当我搜索“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
希望代码可以泛化,这样一旦我有一个更大的向量,它就可以泛化。
谢谢!
当我搜索“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
希望代码可以泛化,这样一旦我有一个更大的向量,它就可以泛化。
谢谢!
如果您更喜欢紧凑的代码
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
也许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]]
上面的列表项显示为,对于长度为 3 的组合,您将得到:matrix
lapply(seq_along(x), function(y) combn(x, y))
# [[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