Это работает, но очень не элегантно:
df <- read.table(header = TRUE,
text = "src target
cllient1 cllient2
cllient1 cllient4
cllient1 cllient6
cllient2 cllient3
cllient4 cllient1
cllient4 cllient3
cllient5 cllient6
cllient6 cllient5")
df_graph <- graph_from_data_frame(df)
wc <- cluster_walktrap(df_graph)
df_graph0 <- df_graph
V(df_graph)$name <- membership(wc)
получить список ребер на основе членства, который в вашем запросе переводится в from
и to
.
x <- as_edgelist(df_graph, names = T)
communities <- ends(df_graph, E(df_graph))
сброс именидентификаторы вершин (не запрашиваются, но могут быть полезны)
V(df_graph)$name <- 1:vcount(df_graph)
ids <- ends(df_graph, E(df_graph))
установить имена вершин, соответствующие клиентам (label
)
V(df_graph)$name <- V(df_graph0)$name
label <- ends(df_graph, E(df_graph))
хранить в dataframe
df_result <- data.frame(from = communities[,1], to = communities[,2],
label1 = label[,1], label2 = label[,2], ids1 = ids[,1], ids2 = ids[,2])
Что приводит к этому:
from to label1 label2 ids1 ids2
1 1 1 cllient1 cllient2 1 2
2 1 1 cllient1 cllient4 1 3
3 1 2 cllient1 cllient6 1 5
4 1 1 cllient2 cllient3 2 6
5 1 1 cllient4 cllient1 3 1
6 1 1 cllient4 cllient3 3 6
7 2 2 cllient5 cllient6 4 5
8 2 2 cllient6 cllient5 5 4
Кроме того, вы можете вставить label1
и label2
, чтобы разделить запятую label
столбца.
РЕДАКТИРОВАТЬ: В порядкечтобы «свернуть» метки, вы можете сделать что-то вроде этого:
library(tidyr)
library(dplyr)
df_result$label <- paste(df_result$label1, df_result$label2, sep = ",")
df_nested <- df_result %>% select(from, to, label) %>% nest(-from, -to)
Чтобы использовать эти вложенные метки в качестве меток или строк, вставьте их вместе:
df_nested$data <- sapply(1:nrow(df_nested),
function(x) paste(unlist(df_nested$data[[x]]), collapse = " "))