メモ:行列を列ごと・行ごとのベクトルのリストに変換したいときはsplit()にcol()/row()

combn()は行列を返すけど、ベクトルのリストを返してほしいんだよなー、と思っていろいろ調べてた時のメモ。 col()/row()でそれぞれ列と行のインデックスが取れるので、これをsplit()に渡せば分割できる。簡単ですね。

こういう感じ。

x <- combn(letters[1:3], 2)
x
#>      [,1] [,2] [,3]
#> [1,] "a"  "a"  "b" 
#> [2,] "b"  "c"  "c"
split(x, col(x))
#> $`1`
#> [1] "a" "b"
#> 
#> $`2`
#> [1] "a" "c"
#> 
#> $`3`
#> [1] "b" "c"
split(x, row(x))
#> $`1`
#> [1] "a" "a" "b"
#> 
#> $`2`
#> [1] "b" "c" "c"

ほんとうにやりたかったのはこっちだけど、character(0)が消えてしまうのは何かしら対処が必要。

x <- lapply(0:2, function(m) combn(letters[1:3], m))
x
#> [[1]]
#>      [,1]
#> 
#> [[2]]
#>      [,1] [,2] [,3]
#> [1,] "a"  "b"  "c" 
#> 
#> [[3]]
#>      [,1] [,2] [,3]
#> [1,] "a"  "a"  "b" 
#> [2,] "b"  "c"  "c"

x <- lapply(x, function(x) {
  split(x, col(x))
})

unname(unlist(x, recursive = FALSE))
#> [[1]]
#> [1] "a"
#> 
#> [[2]]
#> [1] "b"
#> 
#> [[3]]
#> [1] "c"
#> 
#> [[4]]
#> [1] "a" "b"
#> 
#> [[5]]
#> [1] "a" "c"
#> 
#> [[6]]
#> [1] "b" "c"