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

时间:2019-01-10 13:28:13

标签: arrays r dataframe data-management

我在一个数组中包含大量矩阵(超过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
.  .   .   .  .
.  .   .   .  .

有没有快速的方法可以做到这一点? 这对于我的以下计算将是非常有利的!

2 个答案:

答案 0 :(得分:3)

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

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"))
)

答案 1 :(得分:0)

我为您要实现的目标制作了一些小的示例数据,称为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