我面临的问题是我想知道有多少个节点连接到igraph中随机选择的一组节点。因此,我使用的是具有多个节点的数据集。我制作了一个较小的示例图,它足以解释我的问题。
这是示例代码:
library (igraph)
#### Random graph #####
set.seed(1) #reproduction
g <- erdos.renyi.game(50,1/35, directed = F, loops = F)
#### simple random sample from graph object #####
set.seed(123) #reproduction
smpl <- sample(1:vcount(g),20)
#### assign random sample to a igraph attr ####
V(g)$randomSample <- "0"
V(g)[smpl]$randomSample <- "1"
##### plot #####
V(g)$color = "#F5E31C" #yellow
V(g)[smpl]$color="#1CA38B" #green
set.seed(123) #reproduction
plot(g,
vertex.label.color = "Black",
vertex.size = 15,
layout = layout.fruchterman.reingold(g))
在示例图中,我想知道哪些非采样节点(黄色)以及如何将其<2倍连接到采样节点(绿色)。以及哪些和多少个非采样节点(黄色)与采样节点(绿色)的连接次数≥2次。
#### options? ####
adjacent_vertices(g, 34, mode = "total")
#Is there a option to use a count or a loop function of some sort for this?
V(g)$degree <- degree(g,v=V(g), mode="total", loops = FALSE, normalized = FALSE)
#Does give the number of ties a node has, is there a option to change this in a way so it only gives the degree to the sampled nodes?
例如,节点34连接到节点3、32、39、44、48。在所需的输出中,应将节点48删除,并将度数设置为4。此外,我想知道是否有办法计算图的manny节点与采样节点之间的关系是否<2个关系以及与采样节点具有> = 2个关系的状态数。
侧面说明:我的R语言技能确实处于新手水平,所以请耐心等待
答案 0 :(得分:1)
让我们定义一个函数,该函数返回图形的节点randomSample
的相邻节点和关联的v
标志。我们使用igraph::neighbors
,并将结果存储在list
个data.frame
中。
# Function to return vertices and randomSample
# information for all neighbours of v
get.neighbours <- function(v) {
lapply(setNames(v, as.character(v)), function(x) {
near <- neighbors(g, x, mode = "total")
cbind.data.frame(
vertex = as.integer(near),
randomSample = as.integer(V(g)[near]$randomSample))
})
}
进一步的解释:get.neighbours
以节点序列v
作为输入,对于v
中的每个节点,使用neighbors
确定其邻居。对于每个节点,我们提取相邻的数字节点ID和节点属性randomSample
并将条目存储在data.frame
中。结果对象是list
中的data.frame
,其中data.frame
中的每个节点都有一个v
。
我们现在可以为每个非样本节点(randomSample = 1
)计算连接的样本节点(randomSample = 0
)的数量。为此,我们为所有非样本节点V(g)[V(g)$randomSample == 0]
确定所有样本邻居。
# Number of connected sample nodes for every non-sample node
nConnected <- sapply(get.neighbours(V(g)[V(g)$randomSample == 0]), function(x)
nrow(x[x$randomSample == 1, ]))
进一步的解释:对于具有属性randomSample = 0
的每个节点,我们确定其邻居;然后,我们从结果data.frame
中循环遍历list
,并计算与具有属性randomSample = 1
的相邻节点相对应的行数。这将返回每个非样本节点的样本节点数量的向量。
那么连接到样本节点的次数不到2次的非样本节点的数量就是
# Count the number non-sample nodes that are connected
# < 2 times to sample nodes
sum(nConnected < 2)
#[1] 27
与样本节点连接的非样本节点的数量> = 2次
# Count the number of non-sample nodes that are connected
# >=2 times to sample nodes
sum(nConnected >= 2)
#[1] 3
要了解哪些非样本节点已连接> = 2次
names(which(nConnected >= 2))
#[1] "7" "28" "34"