虽然迟到了,但我想提出两种不同的方法
- 动态“稀疏矩阵”信息的存储和读取
- 并使用
dcast() 创建矩阵。
存储和读取动态矩阵信息
OP 已经披露矩阵的列名和行名都来自向量,并且实际上每个向量的大小都非常大。她已经给出了样本数据
vector1 <- c(a,b,c,d)
vector2 <- c(a,c,e,f,g)
vector3 <- c(d,f,g,z)
列名没有有效的字符串。每个列名都需要用引号括起来(就像 in the other answer 所做的那样),这对于大型向量来说是乏味的。
因此,我建议将矩阵的行名rn 和列名cn 以紧凑方便的形式存储:
rn cn
vector1 a,b,c,d
vector2 a,c,e,f,g
vector3 d,f,g,z
在文件或字符串中。 cn 包含用逗号分隔的矩阵列的名称。
这个“稀疏矩阵定义”可以读取,例如,
library(data.table)
sparse <- fread("
rn cn
vector1 a,b,c,d
vector2 a,c,e,f,g
vector3 d,f,g,z
")
创建矩阵
这需要两个步骤。首先,需要为每个行名提取列名。这是通过使用strsplit() 来完成的:
long <- sparse[, strsplit(cn, ","), by = rn]
long
# rn V1
# 1: vector1 a
# 2: vector1 b
# 3: vector1 c
# 4: vector1 d
# 5: vector2 a
# 6: vector2 c
# 7: vector2 e
# 8: vector2 f
# 9: vector2 g
#10: vector3 d
#11: vector3 f
#12: vector3 g
#13: vector3 z
这会以长格式返回稀疏矩阵信息。请注意,V1 现在包含矩阵列的名称作为字符,使我们无需手动将它们括在引号中。
现在,OP 期望得到 宽格式 的结果,0 或 1 表示相应列的缺失或存在。可以使用dcast() 完成重塑:
result <- dcast(long, rn ~ V1, length)
result
# rn a b c d e f g z
#1: vector1 1 1 1 1 0 0 0 0
#2: vector2 1 0 1 0 1 1 1 0
#3: vector3 0 0 0 1 0 1 1 1
或者,以更复杂的形式:
result <- dcast(sparse[, strsplit(cn, ","), by = rn], rn ~ V1, length)
现在,可以将结果从data.table 转换为具有适当行名的矩阵:
mat <- as.matrix(result[, .SD, .SDcols = -c("rn")])
rownames(mat) <- result[, rn]
mat
# a b c d e f g z
#vector1 1 1 1 1 0 0 0 0
#vector2 1 0 1 0 1 1 1 0
#vector3 0 0 0 1 0 1 1 1