R:将矩阵重新排列为三列

R:将矩阵重新排列为三列,r,R,我在R中有一个矩阵。每个条目I,j都是分数,行名和列名都是ID 而不是矩阵,我只想要一个3列矩阵,它有:I,j,得分 现在我使用嵌套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,coln

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

而不是矩阵,我只想要一个3列矩阵,它有:
I
j
得分

现在我使用嵌套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
        }

    }
用于(行名中的i(g))
{
打印(其中(行名称(g)==i))
对于(以colnames(g)表示的j)
{
cur.vectornew.file
}
}
但我认为这是非常低效的…我相信有更好的方法,我只是在R方面还不够好。
想法?

如果我理解正确,你需要将矩阵展平。
您可以使用
as.vector
rep
添加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))
请注意,此代码将矩阵转换为
data.frame
,因为行和列名称可以是字符串,并且不能有不同列类型的矩阵。

如果您确定所有行和列名称都是数字,则可以将其强制转换为矩阵。

如果您先将矩阵转换为表(使用
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
>tmp dimnames(tmp)as.data.frame(as.table(tmp))
Var1 Var2频率
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
8bf8
9CF9
10 a G 10
11 b G 11
12 c G 12

请使用
dput(g)
发布矩阵的内容-这将更容易理解您的问题未来的搜索者,请参阅此处的反向操作的答案:这对我来说最简单。但是,我必须先将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