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

时间:2016-01-22 16:30:38

标签: r reshape2

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

for item in data["Results"]:
    print item["Name"]    

我可以将其更改为长格式:

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

但我希望根据 value

获得多重条目
library("reshape")
(m1 <- melt(m0))
  X1 X2 value
1  A  A     1
2  B  A     2
3  A  B     3
4  B  B     4

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 中是否有参数考虑根据值乘以条目?或任何其他可以执行此问题的库?

1 个答案:

答案 0 :(得分:3)

我们可以使用base R执行此操作。我们转换了dimnames的&#39; m0&#39;到一个&data; data.frame&#39;使用expand.grid的两列,然后使用&#39; m0&#39;,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,我们会转换&#39; m0&#39;长期&#39;格式化,然后像以前一样复制行。

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

正如@Frank所提到的,我们也可以table使用as.data.frame来创建&#39; dM&#39;

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