通过网络包中的 name/id 访问节点

accessing nodes by name/id in the network package

在网络和 sna 包中,有没有办法确保您通过任意 id/name 可靠地访问节点,并使用此 id/name 输出 return?看来,即使明确分配了顶点名称,包默认使用节点的 1:n 整数索引,我至少找不到访问内部索引的方法。这在以下示例中可见:

library(network)
library(sna)
set.seed(12345)
m<-matrix(rbinom(100,1,0.02),10)
diag(m) <- 0
m.sna <- as.network.matrix(m, directed = T)
network.vertex.names(m.sna) <- letters[1:10]

#note that there is a tie between 3,7 or c,g
get.neighborhood(m.sna,"c", type = "combined") # this fails to return node g/7 as part of node c's neighborhood
get.neighborhood(m.sna,3, type = "combined") # this correctly returns the node

第一次尝试 return 节点 g/7 的邻域使用显式顶点名称失败 return 它的邻居(节点 c/3)。第二次尝试使用索引(基于原始矩阵的行)成功。但是这个索引似乎不是一个明确的节点属性。有没有办法更好地控制节点的索引方式?

您必须使用顶点索引,但您可以通过属性获取它们。

您可以像这样获取 "vertex.names" 属性值:

get.vertex.attribute(m.sna, "vertex.names")
#>  [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"

但这可能会有点冗长,因此您可以使用 %v% 中缀代替:

m.sna %v% "vertex.names"
#>  [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"

然后您可以使用 == 找出哪些值等于您想要的顶点名称:

m.sna %v% "vertex.names" == "c"
#>  [1] FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

您可以将其包裹在 which() 中以获得该顶点的索引:

which(m.sna %v% "vertex.names" == "c")
#> [1] 3

将它们放在一起可以得出以下结果:

get.neighborhood(m.sna, 
                 v = which(m.sna %v% "vertex.names" == "c"), 
                 type = "combined")
#> [1] 7