get.inducedSubgraph изолированные изменения

У меня есть список, содержащий 3000 сетей. Для каждого из них мне нужно рассчитать плотность среди альтеров, у которых атрибут "att"==1. Я попробовал несколько вариантов, и вот мой окончательный код (я просто экспериментирую с 3 сетями). Основная проблема заключается в том, что некоторые сети не содержат никаких изменений, для которых "att"==1. Так как get.inducedSubgraph не работает для этих случаев, я пытаюсь устранить их. Тем не менее, я все еще получаю сообщение об ошибке. Пробуя разные варианты, мне кажется, что сообщение появляется, когда у меня есть только два изменения в сети, и они не связаны друг с другом (плотность = 0). Это возможно? Иначе, какую ошибку я делаю?

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

1 ответ

Похоже, проблема в том, что вы создаете свой size а также density переменные в качестве векторов, а затем попробуйте проиндексировать их, используя список обозначений [[]] вместо векторного обозначения []

изменение вашего кода работает следующим образом:

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)

К вашему сведению, если вы делаете это для тысяч сетей, может быть более эффективным в использовании lapply или же sapply синтаксис вместо for петля. т.е.

size<-sapply(seq_along(net.list),function(i){
  sum(get.vertex.attribute(net.list[[i]], "att")=="1")}
)
Другие вопросы по тегам