我在一个数组中包含大量矩阵(超过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
. . . . .
. . . . .
有没有快速的方法可以做到这一点? 这对于我的以下计算将是非常有利的!
答案 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