У меня проблема с сетевыми данными в R. Предположим, у меня есть график, который выглядит так:

library(igraph)
a1=data.frame(A=c(1,1,2,2,3,7,9,10),B=c(2,3,4,5,6,8,8,11))
a2=graph_from_data_frame(a1, directed = F)
plot(a2)

Я вижу, что существует три независимых подграфа, и узлы с 1 по 6 принадлежат подграфу 1, узлы с 7 по 9 принадлежат подграфу 2, а узлы 10 и 11 принадлежат подграфу 3.

a3=data.frame(node=c(1:11),sub=c(1,1,1,1,1,1,2,2,2,3,3))

Я хочу вывести таблицу типа a3, и есть ли прямой код для выполнения этого назначения в R?

1
Vesper 24 Сен 2021 в 20:38

2 ответа

Лучший ответ

Вот решение.

sub <- clusters(a2)$membership
a3 <- data.frame(node = names(sub), sub)
a3 <- a3[order(as.integer(a3$node)), ]
a3

Альтернатива:

cmp <- components(a2)
data.frame(node = unlist(groups(cmp)), 
           sub = sort(as.integer(cmp$membership)))
2
Rui Barradas 24 Сен 2021 в 17:50

Другой вариант с использованием decompose

> Map(
+   function(x, y) data.frame(node = names(V(x)), sub = y),
+   d <- decompose(a2),
+   seq_along(d)
+ )
[[1]]
  node sub
1    1   1
2    2   1
3    3   1
4    4   1
5    5   1
6    6   1

[[2]]
  node sub
1    7   2
2    9   2
3    8   2

[[3]]
  node sub
1   10   3
2   11   3
0
ThomasIsCoding 24 Сен 2021 в 21:46