There are thousands of results on SO when I search for \"vector combinations in R\" but I can\'t find the answer to my question. Apologies if it is a duplicate:
I ha
If you prefer compact code
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
To avoid repetition, you'll have to deal with nested list but you can simplify the result using 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
Perhaps combn
in conjunction with lapply
might be helpful:
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
As @Roland points out, there is also a simplify
argument to combn
that when set to FALSE
would create a nested list
of individual column vectors rather than a matrix
of all the results. For example, instead of list item [[3]]
above being presented as a matrix
, if you used lapply(seq_along(x), function(y) combn(x, y))
, for the combinations of length 3 you would get:
# [[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