我在R的矩阵中的每个条目i,j是一个得分和rownames和colnames是IDS.
取而代之的是矩阵的我只是想有一个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
}
}
Run Code Online (Sandbox Code Playgroud)
但是我觉得这样效率非常低......我确信有一个更好的方法我还不够R.思考?
如果您首先将矩阵转换为表(带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
Run Code Online (Sandbox Code Playgroud)
如果我理解正确,你需要弄平矩阵.
您可以使用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))
Run Code Online (Sandbox Code Playgroud)
结果:
> 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
Run Code Online (Sandbox Code Playgroud)
请注意,此代码将矩阵转换为a data.frame,因为行和列名称可以是字符串,并且您不能使用具有不同列类型的矩阵.
如果您确定所有行和列名称都是数字,则可以将其强制转换为矩阵.