【问题标题】:R: Rearrange matrix into three columnsR:将矩阵重新排列为三列
【发布时间】:2012-03-28 18:23:47
【问题描述】:

我在 R 中有一个矩阵。每个条目 i,j 是一个分数,行名和列名是 id。

我只想要一个 3 列矩阵,而不是矩阵:i,j,score

现在我正在使用嵌套的 for 循环。喜欢:

for(i in rownames(g))
    {
        print(which(rownames(g)==i))
        for(j in colnames(g))
        {
            cur.vector<-c(cur.ref, i, j, g[rownames(g) %in% i,colnames(g) %in% j])
            rbind(new.file,cur.vector)->new.file
        }

    }

但我认为那是非常低效的......我敢肯定有更好的方法我对 R 还不够好。 想法?

【问题讨论】:

  • 请使用dput(g) 发布您的矩阵内容,这样可以更容易理解您的问题
  • 未来的搜索者,在这里查看反向操作的答案:stackoverflow.com/q/9617348/210673

标签: r


【解决方案1】:

如果我理解正确,您需要展平矩阵。
您可以使用 as.vectorrep 添加 id 列,例如:

m = cbind(c(1,2,3),c(4,5,6),c(7,8,9))
row.names(m) = c('R1','R2','R3')
colnames(m) = c('C1','C2','C3')

d <- data.frame(i=rep(row.names(m),ncol(m)),
                j=rep(colnames(m),each=nrow(m)),
                score=as.vector(m))

结果:

> m
   C1 C2 C3
R1  1  4  7
R2  2  5  8
R3  3  6  9

> d
   i  j score
1 R1 C1     1
2 R2 C1     2
3 R3 C1     3
4 R1 C2     4
5 R2 C2     5
6 R3 C2     6
7 R1 C3     7
8 R2 C3     8
9 R3 C3     9

请注意,此代码将矩阵转换为 data.frame,因为行和列名称可以是字符串,并且您不能拥有具有不同列类型的矩阵。
如果您确定所有行名和列名都是数字,则可以将其强制转换为矩阵。

【讨论】:

    【解决方案2】:

    如果您先将矩阵转换为表格(使用as.table),然后再转换为数据框(as.data.frame),那么它将完成您的要求。一个简单的例子:

    > tmp <- matrix( 1:12, 3 )
    > dimnames(tmp) <- list( letters[1:3], LETTERS[4:7] )
    > as.data.frame( as.table( tmp ) )
       Var1 Var2 Freq
    1     a    D    1
    2     b    D    2
    3     c    D    3
    4     a    E    4
    5     b    E    5
    6     c    E    6
    7     a    F    7
    8     b    F    8
    9     c    F    9
    10    a    G   10
    11    b    G   11
    12    c    G   12
    

    【讨论】:

    • 这对我来说最容易。但是,我必须先将我的 data.frame 变成一个矩阵,然后变成一个表格,然后再变成一个数据框 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多