0

3,000 のネットワークを含むリストがあります。それらのそれぞれについて、属性「att」==1 の変更者間の密度を計算する必要があります。いくつかのオプションを試しましたが、これが最終的なコードです (3 つのネットワークで実験しています)。主な問題は、一部のネットワークには "att"==1 の変更が含まれていないことです。これらのケースでは get.inducedSubgraph が機能しないため、それらを排除しようとしています。ただし、まだエラー メッセージが表示されます。さまざまなオプションを試してみると、ネットワークに2つのオルターしかなく、互いにリンクされていない(密度= 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
4

1 に答える 1

0

問題は、変数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)

参考までに、何千ものネットワークに対してこれを行っている場合は、ループの代わりにlapplyorsapply構文を使用する方が効率的かもしれません。forすなわち

size<-sapply(seq_along(net.list),function(i){
  sum(get.vertex.attribute(net.list[[i]], "att")=="1")}
)
于 2015-09-08T19:07:47.743 に答える