Создание нескольких Dataframes из многомерного массива матриц - PullRequest
0 голосов
/ 10 января 2019

У меня огромное количество матриц (более 50), включенных в один массив. Каждая из моих матриц представляет год (1951, 1952 и т. Д.). Каждая матрица содержит наблюдения 4 растений в 80 местах. Следовательно, каждая матрица имеет 4 столбца и 80 строк.

Я хочу переставить мои данные в 4 кадра данных. Один Dataframe для каждого завода, означающий, что измерения моего массива (разные годы) становятся моими именами столбцов, а различные местоположения становятся моими именами строк.

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 голосов
/ 10 января 2019

Предположим, у нас есть массив 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"))
)
0 голосов
/ 10 января 2019

Я сделал небольшой пример данных под названием 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
...