从多维矩阵数组创建多个数据帧
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"))
)
我在一个数组中包含大量矩阵(超过 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"))
)