【问题标题】:Reshape matrix to data frame将矩阵重塑为数据框
【发布时间】:2014-09-22 16:59:18
【问题描述】:

我的关联矩阵文件看起来像这样(4 行和 3 列)。

test=read.table("test.csv", sep=",", header=T)
head(test)
            LosAngeles   SanDiego    Seattle    
            1            2           3          
A    1      0.1          0.2         0.2        
B    2      0.2          0.4         0.2        
C    3      0.3          0.5         0.3        
D    4      0.2          0.5         0.1        

我想要将这个矩阵文件重塑为数据框。结果应如下所示(12(= 4 * 3) 行和 3 列):

RowNum    ColumnNum    Value
1         1            0.1
2         1            0.2
3         1            0.3
4         1            0.2
1         2            0.2
2         2            0.4
3         2            0.5
4         2            0.5
1         3            0.2
2         3            0.2
3         3            0.3
4         3            0.1

也就是说,如果我的矩阵文件有 100 行和 90 列。我想制作包含 9000 (= 100 * 90) 行和 3 列的新数据框文件。

我尝试使用 reshape 包,但似乎无法正确使用。有什么建议可以解决这个问题吗?

【问题讨论】:

  • 试试这个来自 (stackoverflow.com/questions/15885111/…) 的 as.data.frame(as.table(test))
  • 你能提供dput(head(test))吗?
  • 也许reshape2 包中的melt 会有所帮助(我有点不确定您的数据格式 - 看起来不像 4 行/3 列)
  • 谢谢你,奥桑!不幸的是,我也确实在发布之前阅读了问题,但它对我不起作用。
  • 非常感谢大卫!!!其实我的数据是这样的......dput(head(test))......structure(list(X.1 = c(NA, 1L, 2L, 3L, 4L, 5L), GO.0000165 = c(1, 0.285, 0.336, 0.183, 0.067, 0.062), GO.0001505 = c(2, 0.215, 0.197, 0.19, 0.084, 0.078), GO.0001568 = c(3, 0.11, 0.104, 0.13, 0.091, 0.084), GO.0001944 = c(4, 0.086, 0.083, 0.105, 0.089, 0.082), GO.0001945 = c(5, 0.0. , 0.093, 0.05, 0.086, 0.079), GO.0002755 = c(6, 0.176, 0.245, 0.116, 0.101, 0.096), ....

标签: r matrix


【解决方案1】:

这应该可以解决问题:

test <- as.matrix(read.table(text="
            1            2           3          
    1      0.1          0.2         0.2        
    2      0.2          0.4         0.2        
    3      0.3          0.5         0.3        
    4      0.2          0.5         0.1", header=TRUE)) 

data.frame(which(test==test, arr.ind=TRUE), 
                 Value=test[which(test==test)], 
                 row.names=NULL)
#   row col Value
#1    1   1   0.1
#2    2   1   0.2
#3    3   1   0.3
#4    4   1   0.2
#5    1   2   0.2
#6    2   2   0.4
#7    3   2   0.5
#8    4   2   0.5
#9    1   3   0.2
#10   2   3   0.2
#11   3   3   0.3
#12   4   3   0.1

【讨论】:

  • 我还打算用更简洁的回答:library(reshape2);melt(test);。然后我意识到你的方法快了 3 倍以上(在我的电脑上)。奇怪的是,我不会称之为最优雅的方式,但绝对是一种更快的方式。干得好。
  • 也许是data.frame(row = c(row(test)), col = c(col(test)), Value = c(test))
  • @flodel 当矩阵变大(例如 1000 x 1000)时,您的建议会快得多(在我的机器上快 6 倍)。凉爽的!在这个小例子中,我发布的那个稍微快了一点(~ 8%)。
【解决方案2】:

使用as.data.frame.table。它的老板:

m <- matrix(data = c(0.1, 0.2, 0.2,
                     0.2, 0.4, 0.2,
                     0.3, 0.5, 0.3, 
                     0.2, 0.5, 0.1),
            nrow = 4, byrow = TRUE, 
            dimnames = list(row = 1:4, col = 1:3))
m
#    col
# row   1   2   3
#   1 0.1 0.2 0.2
#   2 0.2 0.4 0.2
#   3 0.3 0.5 0.3
#   4 0.2 0.5 0.1

as.data.frame.table(m)
#    row col Freq
# 1    1   1  0.1
# 2    2   1  0.2
# 3    3   1  0.3
# 4    4   1  0.2
# 5    1   2  0.2
# 6    2   2  0.4
# 7    3   2  0.5
# 8    4   2  0.5
# 9    1   3  0.2
# 10   2   3  0.2
# 11   3   3  0.3
# 12   4   3  0.1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-25
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-19
    • 1970-01-01
    相关资源
    最近更新 更多