Как подсчитать количество компонентов при каждом обновлении графика в R

#r #igraph

Вопрос:

У меня есть следующие данные:

 data <- data.frame(name = c("A", "A", "A", "B", "B", "C", "D", "D", "D", "D", "E", "B", "C", "C"),
                 surname = c("aa", "bb", "cc", "dd", "hh", "ee", "ii", "aa", "qq", "ff", "gg", "ff", "gg", "cc"))
 

Эти данные создают связный график:

 plot(graph_from_data_frame(data, directed = F))
 

который, очевидно, имеет 1 компонент.

Я хотел бы подсчитать количество компонентов, создаваемых этими данными, каждый раз, когда мы добавляем строку на график. Например, исходный граф будет иметь 1 компонент, так как вершины A и aa в первой строке данных соединены. Следующий график снова будет иметь 1 компонент, так как мы добавляем вторую строку и из-за значения A в столбце имя. Когда мы включим четвертую строку (B, dd), график будет состоять из 2 компонентов.

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

 for (i in 1:dim(data)[1]) {
data$number_of_components[i] <- components(graph_from_data_frame(data[1:i,], directed = F))$no}
 

Есть ли более умный/более сложный способ получить это? Спасибо.

Ответ №1:

Вы можете взглянуть на sapply() .

 dt$number_of_components <- sapply(seq_len(nrow(dt)), function(x) {
  g <- graph_from_data_frame(dt[seq_len(x),], directed = FALSE)
  components(g)$no
})

dt

#    name surname number_of_components
# 1     A      aa                    1
# 2     A      bb                    1
# 3     A      cc                    1
# 4     B      dd                    2
# 5     B      hh                    2
# 6     C      ee                    3
# 7     D      ii                    4
# 8     D      aa                    3
# 9     D      qq                    3
# 10    D      ff                    3
# 11    E      gg                    4
# 12    B      ff                    3
# 13    C      gg                    2
# 14    C      cc                    1
 

Ответ №2:

Вы можете попробовать decompose , как показано ниже

 transform(
    data,
    num_components = sapply(
        seq_along(name),
        function(k) length(decompose(graph_from_data_frame(head(data, k), directed = FALSE)))
    )
)
 

или

 transform(
    data,
    num_components = lengths(
        sapply(
            seq_along(name),
            function(k) decompose(graph_from_data_frame(head(data, k), directed = FALSE))
        )
    )
)
 

что дает

    name surname num_components
1     A      aa              1
2     A      bb              1
3     A      cc              1
4     B      dd              2
5     B      hh              2
6     C      ee              3
7     D      ii              4
8     D      aa              3
9     D      qq              3
10    D      ff              3
11    E      gg              4
12    B      ff              3
13    C      gg              2
14    C      cc              1
 

Комментарии:

1. Основываясь на результатах, я думаю, что что-то не так. Пожалуйста, проверьте мой код или код с функцией sapply ().