R:将计数矩阵重塑为具有多个条目的长格式

R: Reshape count matrix to long format with multiple entries

我有一个矩阵。矩阵的条目是维度级别组合的计数。例如:

(m0 <- matrix(1:4, nrow=2, dimnames=list(c("A","B"),c("A","B"))))
  A B
A 1 3
B 2 4

我可以把它改成长格式:

library("reshape")
(m1 <- melt(m0))
  X1 X2 value
1  A  A     1
2  B  A     2
3  A  B     3
4  B  B     4

但我想根据 value:

设置多个条目
m2 <- m1
for (i in 1:nrow(m1)) {
     j <- m1[i,"value"]
     k <- 2
     while ( k <= j) {
         m2 <- rbind(m2,m1[i,])
         k = k+1
     }
 }
> m2 <- subset(m2,select = - value)
> m2[order(m2$X1),]
   X1 X2
1   A  A
3   A  B
31  A  B
32  A  B
2   B  A
4   B  B
21  B  A
41  B  B
42  B  B
43  B  B

melt中是否有参数考虑按值相乘?或者任何其他可以执行此问题的库?

我们可以用 base R 做到这一点。我们使用 expand.grid 将 'm0' 的 dimnames 转换为具有两列的 'data.frame',然后使用 'm0'、order 行并将行名称更改为 NULL(如有必要)。

d1 <- expand.grid(dimnames(m0))
d2 <- d1[rep(1:nrow(d1), c(m0)),]
res <- d2[order(d2$Var1),]
row.names(res) <- NULL
res
#    Var1 Var2
#1     A    A
#2     A    B
#3     A    B
#4     A    B
#5     B    A
#6     B    A
#7     B    B
#8     B    B
#9     B    B
#10    B    B

或者使用 melt,我们将 'm0' 格式转换为 'long' 格式,然后像以前一样复制行。

 library(reshape2)
 dM <- melt(m0)
 dM[rep(1:nrow(dM), dM$value),1:2]

正如@Frank 提到的,我们还可以使用 tableas.data.frame 来创建 'dM'

 dM <- as.data.frame(as.table(m0))