3

「R のベクトルの組み合わせ」を検索すると、何千もの結果が SO にありますが、質問に対する答えが見つかりません。重複している場合はお詫び申し上げます:

私はベクトルを持っていて、(1,2,3,4)(n choose 2) から (n choose 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

そして、うまくいけば、コードが一般化できるので、ベクトルが大きくなれば一般化できるようになります。

ありがとう!

4

2 に答える 2

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
于 2013-07-23T18:26:39.277 に答える
3

おそらく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引数もあります。たとえば、上記のリスト項目を として表示する代わりに、 を使用すると、長さ 3 の組み合わせに対して次のようになります。combnFALSElistmatrix[[3]]matrixlapply(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
于 2013-07-23T18:23:30.787 に答える