【问题标题】:Convert a matrix with dimnames into a long format data.frame将带有 dimnames 的矩阵转换为长格式 data.frame
【发布时间】:2012-05-01 08:39:11
【问题描述】:

希望这里有一个简单的答案,但我在任何地方都找不到。

我有一个包含行名和列名的数字矩阵:

#      1    2    3    4
# a    6    7    8    9
# b    8    7    5    7
# c    8    5    4    1
# d    1    6    3    2

我想将矩阵融合为长格式,将值放在一列中,矩阵行和列名在每一列中。结果可能是data.tabledata.frame,如下所示:

#  col  row  value
#    1    a      6
#    1    b      8
#    1    c      8
#    1    d      1
#    2    a      7
#    2    c      5
#    2    d      6
    ...

感谢任何提示。

【问题讨论】:

标签: r dataframe transformation data.table reshape


【解决方案1】:

使用来自 reshape2 的melt

library(reshape2)
#Fake data
x <- matrix(1:12, ncol = 3)
colnames(x) <- letters[1:3]
rownames(x) <- 1:4
x.m <- melt(x)
x.m

   Var1 Var2 value
1     1    a     1
2     2    a     2
3     3    a     3
4     4    a     4
...

【讨论】:

  • as.data.frame.default(x[[i]], optional = TRUE) 中的错误:无法将类 'structure("dpoMatrix", package = "Matrix")' 强制转换为数据.frame
【解决方案2】:

假设 'm' 是您的矩阵...

data.frame(col = rep(colnames(m), each = nrow(m)), 
           row = rep(rownames(m), ncol(m)), 
           value = as.vector(m))

这在大型矩阵上执行得非常快,还向您展示了矩阵是如何制作的、如何访问其中的内容以及如何构建自己的向量。

【讨论】:

  • 这很有趣,谢谢。对于 1k x 1k 矩阵,在我的机器上发布的所有三个解决方案都在 2% 以内。
【解决方案3】:

as.tableas.data.frame 函数一起执行此操作:

> m <- matrix( sample(1:12), nrow=4 )
> dimnames(m) <- list( One=letters[1:4], Two=LETTERS[1:3] )
> as.data.frame( as.table(m) )
   One Two Freq
1    a   A    7
2    b   A    2
3    c   A    1
4    d   A    5
5    a   B    9
6    b   B    6
7    c   B    8
8    d   B   10
9    a   C   11
10   b   C   12
11   c   C    3
12   d   C    4

【讨论】:

  • OK +1,这是我的一个新人......而且这很罕见。
【解决方案4】:

一种不需要您了解存储结构的修改,如果您使用dimnamesslice.index 函数,它可以轻松扩展到高维数组:

data.frame(row=rownames(m)[as.vector(row(m))],
           col=colnames(m)[as.vector(col(m))],
           value=as.vector(m))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多