r - 从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中的解决方案开放!
解决方案
一种选择是逐行比较,以计算公共值的数量。例如约翰(第一行)和莎拉(第二行):
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()
。
推荐阅读
- linux - 卷曲:当我尝试将输出重定向到文件时出现问题
- caching - 对于 18k/s 吞吐量,Hazelcast 平均获取延迟 > 2 ms
- python - 从python中的列表中删除ndarray
- flutter - 如何在初始化 ChangeNotifierProvider 之前加载数据库?
- css - 正文类更改时如何更改 sass 导入文件
- mysql - 如何使用 if -else 基于条件通过 shell 脚本执行 MySQL 命令?
- node.js - 如何在 Nodejs Mongodb 中设置最低价格最高价格参数,并从通过邮递员发布的这些查询中获取数据
- python - Django:如何从 DateField 中删除无效日期
- c++ - 是否可以使静态 C++ 库自包含?
- python - 为什么我在 pandas 中获得额外的记录并与外部联接合并