首页 > 解决方案 > 从R中的普通数据框创建权重节点和边列表?

问题描述

我正在尝试使用 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

我想改变使用它来创建可用于创建可见网络的节点和边列表。我知道“节点”列表将由“名称”列中的唯一值组成,但我不确定如何使用其余数据来创建“边”列表?

我在想可以按每一列分组,然后从这个函数中读回匹配,但我不知道如何实现这个。我想到的想法是根据他们在不同的功能组中检测到多少匹配来对边缘进行加权。我不确定如何实际实现这一点。

例如,Joe 不会与任何人匹配,因为他不与任何其他人共享公共列。John 和 Sarah 的权重为 2,因为他们共享两个公共列。

也对python中的解决方案开放!

标签: r

解决方案


一种选择是逐行比较,以计算公共值的数量。例如约翰(第一行)和莎拉(第二行):

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

然后你使用combn()library utils中的函数来提前知道你必须计算的 pair-combinaison 的数量:

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


推荐阅读