我尝试从列表pList创建一个邻接矩阵M,该列表包含矩阵M中必须等于1的索引。 例如,M是10x5矩阵 变量pList包含5个元素,每个元素是索引
的向量示例:
s <- list("1210", c("254", "534"), "254", "534", "364")
M <- matrix(c(rep(0)),nrow = 5, ncol = length(unique(unlist(s))), dimnames=list(1:5,unique(unlist(s))))
实际上,我太简单的解决方案是残酷的解决方案,在矩阵的行上有一个for循环:
for (i in 1:nrow(M)){
M[i, as.character(s[[i]])] <- 1
}
因此预期结果为:
M
1210 254 534 364
1 1 0 0 0
2 0 1 1 0
3 0 1 0 0
4 0 0 1 0
5 0 0 0 1
问题是我必须操纵数千行的矩阵,这需要花费太多时间。 我不是“申请”专家,但我想知道是否有更快的解决方案
由于
此致
答案 0 :(得分:2)
我们可以将list
转换为matrix
row/column
索引,使用该索引分配&#39; M&#39;到1。
M[as.matrix(stack(setNames(s, seq_along(s)))[,2:1])] <- 1
M
# 1210 254 534 364
#1 1 0 0 0
#2 0 1 1 0
#3 0 1 0 0
#4 0 0 1 0
#5 0 0 0 1
或者不是使用stack
转换为data.frame
,而是unlist
&#39}。通过复制每个cbind
元素list
的{{1}}序列(使用length
)来获取列索引list
并创建行索引,并分配&#39; M&#39;中的元素到1。
lengths
或者另一种选择是创建M[cbind(rep(seq_along(s), lengths(s)), unlist(s))] <- 1
sparseMatrix