Tenho este gráfico em R em que cada nó tem um peso aleatório:
library(igraph)
library(tidyverse)
set.seed(123)
g <- sample_gnm(n = 20, m = 30, directed = FALSE)
V(g)$weight <- runif(20)
Estou tentando descobrir qual nó tem um peso mais próximo da média de todos os nós.
Se isso não fosse um gráfico de rede, seria bem fácil de fazer. No entanto, não tenho certeza de como fazer isso usando um objeto de gráfico de rede.
Tentei fazer isso da seguinte maneira:
tibble(
node_id = 1:20,
weight = V(g)$weight,
mean_weight_of_all_nodes = mean(V(g)$weight),
abs_distance_from_mean = abs(weight - mean_weight_of_all_nodes)
) %>%
arrange(abs_distance_from_mean) %>%
mutate(rank = row_number())
O resultado fica assim:
# A tibble: 20 × 5
node_id weight mean_weight_of_all_nodes abs_distance_from_mean rank
<int> <dbl> <dbl> <dbl> <int>
1 12 0.414 0.396 0.0180 1
2 11 0.415 0.396 0.0188 2
3 13 0.369 0.396 0.0269 3
4 17 0.466 0.396 0.0702 4
5 8 0.318 0.396 0.0776 5
6 5 0.478 0.396 0.0820 6
7 18 0.266 0.396 0.130 7
8 16 0.233 0.396 0.163 8
9 9 0.232 0.396 0.164 9
10 7 0.216 0.396 0.179 10
11 14 0.152 0.396 0.243 11
12 10 0.143 0.396 0.253 12
13 15 0.139 0.396 0.257 13
14 2 0.691 0.396 0.295 14
15 20 0.0458 0.396 0.350 15
16 6 0.758 0.396 0.363 16
17 4 0.0246 0.396 0.371 17
18 3 0.795 0.396 0.400 18
19 19 0.858 0.396 0.462 19
20 1 0.902 0.396 0.507 20
Essa é a maneira correta de fazer isso?
Sua implementação está correta e pode ser simplificada para:
Você pode gostar do tidygraph .
Criado em 2024-11-11 com reprex v2.1.1
Outra opção pode ser
as_long_data_frame()
+within()
dando
Observe que o data frame está classificado. Um
rank
cálculo explícito é a alternativa. Podemos querer mover os nomes das linhas para uma coluna de identificador.Você pode fazer a mesma coisa que fez antes, mas só precisa gerar um dataframe a partir de
g
o que dá