Может быть, это поможет:
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 = ""))