Цвет узлов на основе элемента списка атрибута в igraph

Я создал сеть с несколькими узлами и ребрами.

g <- graph.formula(4506-8974, 8974-6345, 7842-4653, 4653-6345, 7842-8974)
V(g)$name <- c("4506", "8974", "6345", "7842", "4653")

Я заинтересован в том, чтобы узлы обладали атрибутом ключевого слова на основе моего первоначального dataframe. Где V(g)$keyword показывает ключевое слово узла. Мой фрейм данных принял форму матрицы, в которой строки являются узлами, а столбцы - ключевыми словами. См. Пример ниже.

df <- data.frame("agriculture" = c(1,1,0,0,0), "arts" = c(0,0,0,1,0), "banks" = c(1,0,1,0,0),
   "cities" = c(0,0,0,1,0), "companies" = c(0,0,0,0,1))
rownames(df) <- c("4506", "8974", "6345", "7842", "4653")


NodeID  agriculture  arts  banks  cities  companies
4506      1          0      1       0        0
8974      1          0      0       0        0
6345      0          0      1       0        0
7842      0          1      0       1        0
4653      0          0      0       0        1

Поэтому я применил следующую строку кода для создания атрибута. Пока все работает нормально.

V(g)$keyword <- apply(df, 1, function(x) names(df)[x == 1])

V(g)$keyword[1]
#[1] "agriculture" "banks"
V(g)$keyword[2]
#[2] "agriculture"

Однако моя проблема заключается в том, что я пытаюсь раскрасить узлы на основе этого конкретного атрибута. Допустим, я хочу раскрасить узлы с ключевым словом «сельское хозяйство». График будет окрашивать только узел «8974» в красный цвет, поскольку атрибут ключевого слова узла «4506» принимает форму списка, в котором ключевыми словами являются и «сельское хозяйство», и «банки». Следовательно, он не считает это. Как я могу изменить свой код, чтобы функция ifelse также просматривалась в списке?

V(g)$color <- ifelse(V(g)$keyword == "agriculture", "red", "blue")
plot(g)

Попробуйте sapply(V(g)$keyword, function(kw) { if ("agriculture" %in% kw) "red" else "blue" }).

Alexis 11.08.2018 15:59

Спасибо, Алексис! Итак, чтобы понять строку кода, что на самом деле делает функция (kw)?

pw225 13.08.2018 14:14
V(g)$keyword возвращает список, каждый элемент которого является вектором ключевых слов для данного узла. Функция в sapply каждый раз получает один из этих векторов и проверяет, содержится ли в векторе слово «сельское хозяйство». См. help("match").
Alexis 13.08.2018 16:00

хорошо, спасибо. Однако что такое kw в function (kw)? Не совсем понимаю, откуда это взялось. Могу я просто поставить в скобки все, что захочу?

pw225 14.08.2018 11:18

Да, когда вы определяете функцию, которую нужно применить, вы можете дать переменной любое имя, чтобы вместо этого вы могли написать function(keywords_from_one_vertex) { if ("agriculture" %in% keywords_from_one_vertex) ... если хотите.

Alexis 14.08.2018 14:57
1
5
173
0

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