我正在尝试使用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将不会与任何人匹配,因为他与其他任何人都不共享公共列。约翰和莎拉的权重为2,因为它们共享两个公共列。
也欢迎使用python解决方案!
答案 0 :(得分:0)
一种选择是逐行比较,以便计算公共值的数量。 例如,约翰(第一行)和莎拉(第二行):
struct contact *con;
然后,您使用库 utils 中的函数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
中使用的那种数据框。