2016-06-02 9 views
1

行列Mの1と等しくなければならないインデックスを含むリストpListから隣接行列Mを作成しようとします。 たとえば、Mは10x5の行列です 変数PLISTは、それぞれがインデックスのベクトルであり、5つの要素を含んRインデックスのリストで行列を埋める

例:

for (i in 1:nrow(M)){ 
     M[i, as.character(s[[i]])] <- 1 
} 

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ループと残酷ものです

期待される結果はされるように:

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 

問題は、私は数千行で行列を操作する必要があり、それは時間がかかりすぎるということです。 私は「適用」専門家ではないですが、迅速な解決策があるかどうか、私は我々が割り当てるためにそのインデックスを使用し、matrixrow/columnのインデックスにlistに変換することができます

よろしく

答えて

2

感謝を疑問に思います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 

またはその代わりにdata.frame、我々はできるunlistに変換しstackを使用するに「M」の要素(lengthsを使用して)各list要素のlengthlistの配列を複製することによって作成された行のインデックスと列インデックス、cbindを取得し、1

M[cbind(rep(seq_along(s), lengths(s)), unlist(s))] <- 1 

に「M」の要素を割り当てる「S」

さらに別のオプションは、次を作成することです。sparseMatrix

library(Matrix) 
Un1 <- unlist(s) 
sparseMatrix(i = rep(seq_along(s), lengths(s)), 
      j=as.integer(factor(Un1, levels = unique(Un1))), 
      x=1) 
関連する問題