从多维矩阵数组创建多个数据帧

Creating multiple Dataframes from a multidimensional array of matrices

我在一个数组中包含大量矩阵(超过 50 个)。 我的每个矩阵都代表一年(1951、1952 等等)。 每个矩阵包含 80 个位置的 4 种植物的观察结果。 因此每个矩阵有 4 列和 80 行。

我想将我的数据重新排列成 4 个数据帧。 每个植物一个数据框,这意味着我的数组的维度(不同的年份)成为我的列名,不同的位置成为我的行名。

1951

    10  12 13  24
2   NA  NA NA 288
3  114 139 NA 287
4  104 128 NA 285
5  105 128 NA 289
6  107 123 NA 282
7  112 121 NA 289
8  110 130 NA 287
9  112 128 NA 290
10 107 125 NA 284
.  .   .   .  .
.  .   .   .  .

1952

    10  12 13  24
2   45  34 345 45
3  345 139 NA 287
4  104 128 345 285
5  105 128 NA 289
6  137 123 NA 282
7  112 141 123 239
8  110 130 NA 287
9  112 128 123 230
10 307 125 NA 284
.  .   .   .  .
.  .   .   .  .

有什么快速的方法吗? 这对我接下来的计算有很大的帮助!

我为您要实现的目标制作了一些名为 years_dfs 的小示例数据。如果您使用矩阵列表而不是数据框,它也应该有效。

library(tidyverse)
years <- 1951:1953
year_dfs <- list(data.frame(a = 1:5, b = 6:10), 
                 data.frame(a = 11:15, b = 16:20), 
                 data.frame(a = 21:25, b = 26:30)) %>% 
  `names<-`(years)
year_dfs
$`1951`
  a  b
1 1  6
2 2  7
3 3  8
4 4  9
5 5 10

$`1952`
   a  b
1 11 16
2 12 17
3 13 18
4 14 19
5 15 20

$`1953`
   a  b
1 21 26
2 22 27
3 23 28
4 24 29
5 25 30

lapply(1:ncol(year_dfs[[1]]), function(plant)
  lapply(1:length(year_dfs), function(year)
    year_dfs[[year]][,plant]) %>% 
    as.data.frame %>% 
    `colnames<-`(years)
  ) %>% `names<-`(colnames(year_dfs[[1]]))
$a
  1951 1952 1953
1    1   11   21
2    2   12   22
3    3   13   23
4    4   14   24
5    5   15   25

$b
  1951 1952 1953
1    6   16   26
2    7   17   27
3    8   18   28
4    9   19   29
5   10   20   30

假设我们有 9x4x2 数组 a 在最后的注释中重复显示。然后我们可以使用 apply 从中获取数据帧列表。将 2 替换为 1 或 3 以获得其他变体。

apply(a, 2, as.data.frame)

给予:

$`10`
   1951 1952
2    45   45
3   345  345
4   104  104
5   105  105
6   137  137
7   112  112
8   110  110
9   112  112
10  307  307

$`12`
   1951 1952
2    34   34
3   139  139
4   128  128
5   128  128
6   123  123
7   141  141
8   130  130
9   128  128
10  125  125

$`13`
   1951 1952
2   345  345
3    NA   NA
4   345  345
5    NA   NA
6    NA   NA
7   123  123
8    NA   NA
9   123  123
10   NA   NA

$`14`
   1951 1952
2    45   45
3   287  287
4   285  285
5   289  289
6   282  282
7   239  239
8   287  287
9   230  230
10  284  284

备注

a <- array(data = c(45L, 345L, 104L, 105L, 137L, 112L, 110L, 112L, 307L, 34L, 139L, 
  128L, 128L, 123L, 141L, 130L, 128L, 125L, 345L, NA, 345L, NA, 
  NA, 123L, NA, 123L, NA, 45L, 287L, 285L, 289L, 282L, 239L, 287L, 
  230L, 284L, 45L, 345L, 104L, 105L, 137L, 112L, 110L, 112L, 307L, 
  34L, 139L, 128L, 128L, 123L, 141L, 130L, 128L, 125L, 345L, NA, 
  345L, NA, NA, 123L, NA, 123L, NA, 45L, 287L, 285L, 289L, 282L, 
  239L, 287L, 230L, 284L), 
dim = c(9, 4, 2),
dimnames = list(c("2", "3", "4", "5", "6", "7", "8", "9", "10"), c("10", 
  "12", "13", "14"), c("1951", "1952"))
)