顶点的随机样本(igraph)的边数

时间:2018-07-17 21:37:26

标签: r igraph

我面临的问题是我想知道有多少个节点连接到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))

image of the graph

在示例图中,我想知道哪些非采样节点(黄色)以及如何将其<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语言技能确实处于新手水平,所以请耐心等待

1 个答案:

答案 0 :(得分:1)

  1. 让我们定义一个函数,该函数返回图形的节点randomSample的相邻节点和关联的v标志。我们使用igraph::neighbors,并将结果存储在listdata.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

  2. 我们现在可以为每个非样本节点(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的相邻节点相对应的行数。这将返回每个非样本节点的样本节点数量的向量。

  3. 那么连接到样本节点的次数不到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
    
  4. 要了解哪些非样本节点已连接> = 2次

    names(which(nConnected >= 2))
    #[1] "7"  "28" "34"