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 提到的,我们还可以使用 table
和 as.data.frame
来创建 'dM'
dM <- as.data.frame(as.table(m0))
我有一个矩阵。矩阵的条目是维度级别组合的计数。例如:
(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 提到的,我们还可以使用 table
和 as.data.frame
来创建 'dM'
dM <- as.data.frame(as.table(m0))