2015-09-02 4 views
0

J'ai une liste contenant 3 000 réseaux. Pour chacun d'eux, j'ai besoin de calculer la densité parmi les altères dont l'attribut "att" == 1. J'ai essayé plusieurs options, et voici mon code final (j'expérimente juste avec 3 réseaux). Le principal problème est que certains réseaux ne contiennent aucun alter pour lequel "att" == 1. Puisque get.inducedSubgraph ne fonctionne pas pour ces cas, j'essaie de les éliminer. Cependant, je reçois toujours un message d'erreur. En essayant différentes options il me semble que le message apparaît quand je n'ai que deux alters dans le réseau et qu'il n'y a pas de lien entre eux (densité = 0). Est-ce possible? Sinon, quelle erreur suis-je en train de faire?get.inducedSubgraph isolées isolées

m1 <- matrix(rbinom(25,1,.4),5,5) 
diag(m1) <- 0 
g1 <- network(m1) 
set.vertex.attribute(g1,"att",as.character(rep(0:1,dim(m1)[1]))) 

m2 <- matrix(rbinom(36,1,.4),6,6) 
diag(m2) <- 0 
g2 <- network(m2) 
set.vertex.attribute(g2,"att",as.character(rep(0:1,dim(m2)[1]))) 

m3 <- matrix(rbinom(36,1,.4),6,6) 
diag(m3) <- 0 
g3 <- network(m3) 
set.vertex.attribute(g3,"att",as.character(rep(0,dim(m2)[1]))) 

net.list=list(g1,g2,g3) 

size=vector() 
for(i in 1:length(net.list)) 
size[[i]]=sum(get.vertex.attribute(net.list[[i]], "att")=="1") 
size 
[1] 2 3 0 

density=vector() 
for(i in 1:length(net.list)) 
density[[i]]=ifelse(size[[i]]>1, gden(get.inducedSubgraph(net.list[[i]],v=which(net.list[[i]]%v%"att"=="1"))), NA) 

Error in `[<-`(`*tmp*`, nal, 3, value = NA) : subscript out of bounds 

Répondre

0

il semble que le problème est que vous créez vos size et density des variables comme vecteurs, puis essayez de les indexer en utilisant la notation de liste [[]] au lieu de la notation vectorielle []

changer votre code comme suit travaillé pour moi:

size=vector() 
for(i in 1:length(net.list)) 
size[i]=sum(get.vertex.attribute(net.list[[i]], "att")=="1") 
size 
[1] 2 3 0 

density=vector() 
for(i in 1:length(net.list)) 
density[i]=ifelse(size[i]>1, gden(get.inducedSubgraph(net.list[[i]],v=which(net.list[[i]]%v%"att"=="1"))), NA) 

pour votre information, si vous faites cela pour des milliers de réseaux, peut-être plus efficace d'utiliser lapply ou sapply syntaxe au lieu d'une boucle for. c'est-à-dire

size<-sapply(seq_along(net.list),function(i){ 
    sum(get.vertex.attribute(net.list[[i]], "att")=="1")} 
)