【问题标题】:Create weight node and edges lists from a normal dataframe in R?从R中的普通数据框创建权重节点和边列表?
【发布时间】:2019-02-13 23:43:26
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: r


    【解决方案1】:

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

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

    然后你使用库 utils 中的函数combn() 提前知道你必须计算的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() 中使用的那种数据框。

    【讨论】:

      猜你喜欢
      • 2021-10-26
      • 2022-01-19
      • 2021-08-03
      • 1970-01-01
      • 1970-01-01
      • 2020-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多