#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 ().