

Rのarrayで作成した配列をデータフレームに出力する方法をご教示ください。

具体的には、n次元配列があったとして、以下のとおり出力させたいと考えています。  
1列目には、1次元目のインデックス番号、  
2列目には、2次元目のインデックス番号、  
・  
・  
・  
n列目には、n次元目のインデックス番号、  
n+1列目には、配列の要素

これまでは、配列の次元の数だけforループで行っていましたが、行わないで出力できる  
便利な手段などはありますでしょうか。


CC BY-SA 4.0
2020-09-26T06:13:11.313
70712
2020-09-26T09:43:24.467
35514
question
r array
Rのarrayで作成した配列を配列のインデックスとともにデータフレームで出力したい。


たとえば、このような配列があったとして、

[code]

    > a <- array(1:30, c(3, 5, 2))  # サイズが 3 x 5 x 2 の3次元配列
    > a
    , , 1
    
         [,1] [,2] [,3] [,4] [,5]
    [1,]    1    4    7   10   13
    [2,]    2    5    8   11   14
    [3,]    3    6    9   12   15
    
    , , 2
    
         [,1] [,2] [,3] [,4] [,5]
    [1,]   16   19   22   25   28
    [2,]   17   20   23   26   29
    [3,]   18   21   24   27   30
    
[/code]

`expand.grid()`関数を使えば、インデックスのデータフレームを作成することができます。

[code]

    > indexes <- expand.grid(1:3, 1:5, 1:2)
    > result <- cbind(indexes, as.vector(a))
    > head(result)
      Var1 Var2 Var3 as.vector(a)
    1    1    1    1            1
    2    2    1    1            2
    3    3    1    1            3
    4    1    2    1            4
    5    2    2    1            5
    6    3    2    1            6
    
[/code]

この考え方をベースに、どのようなサイズのN次元配列にも適用できるように拡張すると、こんな感じになると思います。

[code]

    > cbind(do.call(expand.grid, lapply(dim(a), seq_len)), as.vector(a))
    
[/code]

あるいは

[code]

    > library(dplyr)
    > lapply(dim(a), seq_len) %>% do.call(expand.grid, .) %>% cbind(as.vector(a))
    
[/code]


CC BY-SA 4.0
2020-09-26T08:23:06.563
70714
2020-09-26T08:23:06.563
36398
70712
answer


以下は `as.data.frame.table()` を使う方法です。

[code]

    > arr <- array(1:24, dim=c(3, 4, 2))
    > arr
    , , 1
    
         [,1] [,2] [,3] [,4]
    [1,]    1    4    7   10
    [2,]    2    5    8   11
    [3,]    3    6    9   12
    
    , , 2
    
         [,1] [,2] [,3] [,4]
    [1,]   13   16   19   22
    [2,]   14   17   20   23
    [3,]   15   18   21   24
    
    > df <- as.data.frame.table(arr, base=list(as.character(1:max(dim(arr)))), responseName='value')
    > df
       Var1 Var2 Var3 value
    1     1    1    1     1
    2     2    1    1     2
    3     3    1    1     3
    4     1    2    1     4
    5     2    2    1     5
    6     3    2    1     6
    7     1    3    1     7
    8     2    3    1     8
    9     3    3    1     9
    10    1    4    1    10
    11    2    4    1    11
    12    3    4    1    12
    13    1    1    2    13
    14    2    1    2    14
    15    3    1    2    15
    16    1    2    2    16
    17    2    2    2    17
    18    3    2    2    18
    19    1    3    2    19
    20    2    3    2    20
    21    3    3    2    21
    22    1    4    2    22
    23    2    4    2    23
    24    3    4    2    24
    
[/code]


CC BY-SA 4.0
2020-09-26T09:43:24.467
70718
2020-09-26T09:43:24.467
70712
answer