Создайте весовые списки узлов и ребер из нормального кадра данных в R? - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь использовать visNetwork для создания диаграммы узла.Однако мои данные не в правильном формате, и я не смог найти никакой помощи по этому вопросу в Интернете.Мой текущий фрейм данных выглядит примерно так:

name        town        car        color        age        school
John        Bringham    Swift      Red          22         Brighton
Sarah       Bringham    Corolla    Red          33         Rustal
Beth        Burb        Swift      Blue         43         Brighton
Joe         Spring      Polo       Black        18         Riding

Я хочу изменить, используйте это для создания списков узлов и ребер, которые можно использовать для создания визуальной сети.Я знаю, что список «узлов» будет сделан из уникальных значений в столбце «имя», но я не уверен, как бы я использовал остальные данные для создания списка «ребер»?

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

Например, Джо не будет совпадать ни с кем, потому что он не разделяет общие столбцы с другими.Джон и Сара будут иметь вес 2, потому что у них два общих столбца.

Также открыты для решений на python!

1 Ответ

0 голосов
/ 13 февраля 2019

Один из вариантов - сравнивать строку за строкой, чтобы вычислить количество общих значений.Например, для Джона (первая строка) и Сары (вторая строка):

sum(df[1,] == df[2,]) 
# 2

Затем вы используете функцию combn() из библиотеки , использует , чтобы заранее узнать количество парКомбинация, которую вы должны вычислить:

nodes <- matrix(combn(df$name, 2), ncol = 2, byrow = T) %>% as.data.frame()
nodes$V1 <- as.character(nodes$V1)
nodes$V2 <- as.character(nodes$V2)
nodes$weight <- NA
(nodes)
#     V1    V2 weight
#1  John Sarah     NA
#2  John  Beth     NA
#3  John   Joe     NA
#4 Sarah  Beth     NA
#5 Sarah   Joe     NA
#6  Beth   Joe     NA

Наконец, цикл для вычисления веса для каждого узла.

for(n in 1:nrow(nodes)){

  name1 <- df[df$name == nodes$V1[n],]
  name2 <- df[df$name == nodes$V2[n],]
  nodes$weight[n] <- sum(name1 == name2)  

}

#     V1    V2 weight
#1  John Sarah      2
#2  John  Beth      2
#3  John   Joe      0
#4 Sarah  Beth      0
#5 Sarah   Joe      0
#6  Beth   Joe      0

Я думаю, node будет типом данных, который вы можете использовать вфункция visNetwork().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...