Назначить цвет ребру при возвратно-поступательном движении

У меня есть стандартный край списка:

[1]    1 ->  2
[2]    1 ->  3
[3]    1 ->  6
[4]    2 ->  1
[5]    2 ->  3
[6]    2 ->  4
[7]    2 ->  5

Я хотел бы покрасить края в соответствии с тремя правилами:

и) если первое значение меньше второго -> синий

ii) если первое значение больше второго -> красный

Это кажется довольно простым:

y.ed<-as.edgelist(am.ed)
z<-as.data.frame(y.ed)
m<-z[,1]
n<-z[,2]
o<-ifelse(m<n, "red", "blue")

Однако я хотел бы iii) цвет взаимных связей, т.е. 1->2, 2->1 (как указано выше) другой цвет, например, оранжевый. Я не могу понять, как это сделать.

1 ответ

Решение

Подумав об этом немного, мне пришло в голову, что это может быть сложно, и что кто-то, вероятно, уже сделал это, так как сети являются областью довольно тяжелого применения в R, В упаковке igraph Я нашел подход, который будет работать, если вы сможете немного переформатировать свой список краев. Вот пример использования составных данных:

library("igraph")
set.seed(11)
ed <- sample(1:10, 30, replace = TRUE)
g <- graph(edges = ed)
str(g)
plot(g)
m <- is.mutual(g)

Вектор T/F в m затем можно использовать для окрашивания ваших краев по желанию.

Обратите внимание, что в этом примере ребро, начинающееся и заканчивающееся в том же узле / вершине и дублированных ребрах, учитывается функцией как "взаимное". Если у вас есть эти, а также взаимные края, вам, возможно, придется немного поиграться. Этот пример имеет одно обратное ребро (1 <-> 3).

Другие вопросы по тегам