R语言 将矩阵列表转换为单个汇总数据框

kxeu7u2r  于 2023-06-19  发布在  其他
关注(0)|答案(2)|浏览(108)

我有一个矩阵列表。

# Sample data
m1 <- matrix(c(5, 2, 8, 3, 10, 3), nrow = 2, ncol = 3, dimnames = list(c("Mean", "SD"), c("Apples", "Oranges", "Bananas")))
m2 <- matrix(c(4, 1, 7, 2, 9, 2), nrow = 2, ncol = 3, dimnames = list(c("Mean", "SD"), c("Apples", "Oranges", "Bananas")))
m3 <- matrix(c(6, 3, 9, 4, 11, 4), nrow = 2, ncol = 3, dimnames = list(c("Mean", "SD"), c("Apples", "Oranges", "Bananas")))

# Create a list of data frames
matrix_list <- list(m1 = m1, m2 = m2, m3 = m3)

我想将列表中的矩阵组合在一起,生成一个具有以下结构的摘要数据框。

Apples_Mean Apples_SD Oranges_Mean Oranges_SD Bananas_Mean Bananas_SD
m1            5         2            8          3           10          3
m2            4         1            7          2            9          2
m3            6         3            9          4           11          4

我该怎么做?

gk7wooem

gk7wooem1#

使用base R,可以像下面这样使用xtabs + Map + as.data.frame

xtabs(
    Freq ~ m + paste0(Var2, "_", Var1),
    do.call(
        rbind,
        Map(
            \(x, y) cbind(
                m = x,
                as.data.frame.table(y)
            ),
            names(matrix_list),
            matrix_list
        )
    )
)

它给出了

paste0(Var2, "_", Var1)
m    Apples_Mean Apples_SD Bananas_Mean Bananas_SD Oranges_Mean Oranges_SD
  m1           5         2           10          3            8          3
  m2           4         1            9          2            7          2
  m3           6         3           11          4            9          4
5f0d552i

5f0d552i2#

**1)**将dn设置为矩阵的公共dimname,然后使用它来定义所需的输出列名cn。最后使用sapply创建设置名称的结果。

dn <- dimnames(matrix_list[[1]])
cn <- with(expand.grid(dn), paste(Var2, Var1, sep = "_"))
t(sapply(matrix_list, setNames, cn))

给予

Apples_Mean Apples_SD Oranges_Mean Oranges_SD Bananas_Mean Bananas_SD
m1           5         2            8          3           10          3
m2           4         1            7          2            9          2
m3           6         3            9          4           11          4

**2)*另一种可能性是使用listcompr包,它提供了类似Python的列表解析。从上面使用dn,每个gen_named_ 函数的第一个参数是要使用的名称,第二个参数是值,其余参数是要迭代的索引。结果与上面相同。

library(listcompr)

gen.named.matrix("{k}", 
  gen.named.vector("{j}_{i}", matrix_list[[k]][i, j], i = dn[[1]], j = dn[[2]]),
  k = names(matrix_list))

相关问题