簡體   English   中英

從多維矩陣數組創建多個數據框

[英]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
.  .   .   .  .
.  .   .   .  .

有什么快速的方法可以做到這一點嗎? 這對於我的以下計算將是非常有利的!

假設我們有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"))
)

我為您要實現的目標制作了一些小的示例數據,稱為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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM