从R中的普通数据帧创建权重节点和边列表?

时间:2019-02-13 14:52:58

标签: 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将不会与任何人匹配,因为他与其他任何人都不共享公共列。约翰和莎拉的权重为2,因为它们共享两个公共列。

也欢迎使用python解决方案!

1 个答案:

答案 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中使用的那种数据框。