R使用索引列表填充矩阵

时间:2016-06-02 08:12:13

标签: r matrix apply

我尝试从列表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

问题是我必须操纵数千行的矩阵,这需要花费太多时间。 我不是“申请”专家,但我想知道是否有更快的解决方案

由于

此致

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