使用:
m2 <- matrix(t(m1))
dimnames(m2) <- list(paste(rep(rownames(m1), each = nrow(m1)),
colnames(m1), sep = '_'),
'comm')
给出:
> m2
comm
1A_2A 1
1A_2B 2
1A_2C 4
1B_2A 0
1B_2B 1
1B_2C 1
1C_2A 5
1C_2B 4
1C_2C 1
这里做的事情:
- 你可以看到一个矩阵作为一个二维向量。要获得矢量,您可以简单地使用
c(m1)
。这将给出一个向量,其中第一列的值为第一列,然后是第二列的值,依此类推。要按行顺序获取值,可以使用转置矩阵。
- 通过将其包装在
matrix
中,您将得到一列矩阵,这是在未指定列数或行数时的默认行为。因此,matrix(t(m1))
与matrix(t(m1), ncol = 1)
相同。
- 最后,创建长度2 rownames(
paste(rep(rownames(m1), each = nrow(m1)), colnames(m1), sep = '_')
和COLUMNNAMES('comm
的列表),并分配给dimnames
。新的rownames由m1
和粘贴重复m1
多次每个rowname作为列的数目创建那些具有列名称的向量(将被回收)。
如果你想在列顺序的值,则可以调整上述代码:
m2 <- matrix(m1)
dimnames(m2) <- list(paste(rownames(m1),
rep(colnames(m1), each = ncol(m1)), sep = '_'),
'comm')
可以得到相同的结果,但以不同的顺序:
> m2
comm
1A_2A 1
1B_2A 0
1C_2A 5
1A_2B 2
1B_2B 1
1C_2B 4
1A_2C 4
1B_2C 1
1C_2C 1
或者,您也可以使用reshape2
-package:
library(reshape2)
d1 <- melt(m1)
rownames(d1) <- paste(d1$Var1, d1$Var2, sep = '_')
d1 <- d1[, 3, drop = FALSE]
它返回一个数据框:
> d1
value
1A_2A 1
1B_2A 0
1C_2A 5
1A_2B 2
1B_2B 1
1C_2B 4
1A_2C 4
1B_2C 1
1C_2C 1
为了得到一个矩阵,你可以只是包装d1
在as.matrix
:as.matrix(d1)
。
二手数据:
m1 <- matrix(c(1,2,4,0,1,1,5,4,1), ncol = 3, byrow = TRUE,
dimnames = list(c('1A','1B','1C'),c('2A','2B','2C')))
[从广角重塑data.frame到长格式]的可能的复制(https://stackoverflow.com/questions/2185252/reshaping-data-frame-from全格式到长格式) –
我在印象之下如果我使用重塑包,结构将成为一个数据框。结构会保持矩阵吗? – Danielle
您将一列吸收到新的行标签中,丢弃该列并留下一个9x1的数字thingie – Dinesh