从components $ membership在顶点数据框架上创建类

时间:2018-12-03 15:18:33

标签: networking graph igraph sna

我正在寻找一个'description'变量到顶点数据框中,该变量描述在其中找到节点的群集。我的网络是家庭关系,因此群集可能是一个有两个成年人和两个孩子的家庭,有三个孩子的单亲家庭,夫妇等。

我的数据看起来像

Vertices data frame 

 ID      Date.Of.B    Nationality    
 X1      02/05/1995   Ugandan 
 X2      10/10/2010   Ugandan 
 X3      15/12/1975   Irish 
 :           :          : 

边缘列表

ID1    ID2    

X1     X2 
X1     X3  
X2     X3 
X3     X1  
:      :

我计划创建因子水平来描述聚类,即

 2 adults            = 2A
 2 adults 2 children = 2A2C
 5 adults 0 children = 5A

使用 graph_from_data_frame()创建图后,我可以使用 componets() components $ membership 提取组件,为每个群集分配成员资格ID为 components $ membership 的属性的数字。我可以在每个顶点上贴上标签,以确定它们是成人还是儿童。

基本上,我正在寻找添加另一个变量,该变量将给定所在群集的每个ID归类:

新顶点数据框

ID      Date.Of.B    Nationality   Class  
 X1      02/05/1995   Ugandan      2A1C
 X2      10/10/2010   Ugandan      2A1C
 X3      15/12/1975   Irish        2A1C
 :           :          : 

我认为我将必须使用某种循环遍历每个群集,并通过 component $ membership

将一个级别应用于每个顶点

这是我想到的一个选项,目前正在研究中。

如果您还有其他想法或更好的方法,请告诉我。

谢谢

1 个答案:

答案 0 :(得分:0)

也许这会有所帮助:

library(igraph)
library(dplyr)
library(tidyr)

生成示例数据:

set.seed(1)
vertices <- data.frame(ID = 1:20,
                   date = as.character(rnorm(20, -5000, 3000) + Sys.Date()),
                   Nationality = letters[1:20])
edgelist <- data.frame(from = sample(1:20, 15, replace = T),
                   to = sample(1:20, 15, replace = T))
g <- graph_from_data_frame(edgelist,
                       directed = F,
                       vertices = vertices)
cp <- components(g)

将组件成员身份另存为新的顶点属性:

V(g)$components <- membership(cp)

提取顶点以及其他属性:

df <- get.data.frame(g, "vertices")

使用数据框: 首先根据年龄(以天为单位)生成一个新的编码变量,计算发生次数并将结果粘贴到一个新变量中。

 df <- df %>%
       mutate(coding = ifelse(Sys.Date() - as.Date(df$date) > 6570, "A", "C")) %>% 
       group_by(components, coding) %>%
       mutate(n = n()) %>%
       ungroup() %>% 
       mutate(new = paste(n, coding, sep = "")) %>% 
       select(-coding, -n)

然后将基于组件的数据框嵌套到新的数据框中,并删除重复项。

 df2 <- df %>% 
        select(new, components) %>%
        distinct(.keep_all = T) %>% 
        nest(-components)

此后,您可以合并两个数据帧并循环(sapply)以取消列出新的类变量(在本例中为data),这也是您的最终结果。

 df3 <- left_join(df, df2) %>% 
        select(-new)
 df3$data <- sapply(df3$data, function(x) paste(unname(unlist(x)), collapse = ""))