考虑以下矩阵:
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
或者来自tidyr
pivot_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))