Создание классов на фрейме данных вершин из компонентов $ members - PullRequest
0 голосов
/ 03 декабря 2018

Я ищу, чтобы добавить переменную 'description' к фрейму данных вершин, который описывает кластер, в котором найден узел.Моя сеть - это семейные отношения, поэтому кластерами может быть семья из двух взрослых и двух детей, один родитель с тремя детьми, пара и т. Д.

Мои данные выглядят как

Vertices data frame 

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

Edgelist

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 () с компонентами $ членства , дающими каждому кластеру номер участника с идентификаторами атрибутом компонентов $ членства .Я могу применить метку к каждой вершине, чтобы определить их статус как взрослого или ребенка.

В основном я ищу, чтобы добавить еще одну переменную, которая классифицирует каждый идентификатор с учетом кластера, в котором он находится:

Новый фрейм данных вершин

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 $ members

Это одна из опций, о которой я подумал и над которой сейчас работаю.

Пожалуйста, дайте мне знать, если у вас есть другие идеи или лучшие способы сделать это.

Спасибо

1 Ответ

0 голосов
/ 03 декабря 2018

Может быть, это поможет:

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 = ""))
...