将行调整为 R 中矩阵中二维数组的列



考虑以下矩阵:

M <- cbind(c("ID001", "ID003", "ID002", "ID002", "ID003"),
c("BK101", "BK145", "BK101", "BK125", "BK101"), 
c(6, 3, 2, 7, 3))

我想重塑矩阵,所以我得到以下矩阵:

BK101 BK125 BK145
ID001    6     0     0
ID002    2     7     0
ID003    3     0     3

我尝试过:

reshape(M, idvar=[,1], timevar=[,2])

但这行不通。

如果您命名列并将其放入数据框中:

M <- data.frame("a"=c("ID001","ID003","ID002","ID002","ID003"),
"b"=c("BK101","BK145","BK101","BK125","BK101"),
"c"=c(6,3,2,7,3))
xtabs(c~a+b,data=M)
b
a       BK101 BK125 BK145
ID001     6     0     0
ID002     2     7     0
ID003     3     0     3

创建矩阵时的一般模式:

首先创建一个空矩阵,您将在其中存储结果。

X <- matrix(0, nrow=length(unique(M[,1])), ncol=length(unique(M[,2])),
dimnames=list(sort(unique(M[,1])), sort(unique(M[,2]))))

X
BK101 BK125 BK145
ID001     0     0     0
ID002     0     0     0
ID003     0     0     0

然后添加数据。

X[M[,1:2]] <- as.numeric(M[,3])
X
BK101 BK125 BK145
ID001     6     0     0
ID002     2     7     0
ID003     3     0     3

另一个带有dcast的选项

library(reshape2)
dcast(M, a~b, fill = 0)
#      a BK101 BK125 BK145
#1 ID001     6     0     0
#2 ID002     2     7     0
#3 ID003     3     0     3

或者来自tidyrpivot_wider

library(dplyr)
library(tidyr)
M %>%
pivot_wider(names_from = b, values_from = c, values_fill = list(c = 0))
# A tibble: 3 x 4
#  a     BK101 BK145 BK125
#  <fct> <dbl> <dbl> <dbl>
#1 ID001     6     0     0
#2 ID003     3     3     0
#3 ID002     2     0     7

数据

M <- data.frame("a"=c("ID001","ID003","ID002","ID002","ID003"),
"b"=c("BK101","BK145","BK101","BK125","BK101"),
"c"=c(6,3,2,7,3))

最新更新