从Julia DataFrame创建加权图

从Julia DataFrame创建加权图,dataframe,graph,julia,Dataframe,Graph,Julia,给定以下数据帧: | a | b | c | d | |---|---|---|---| | 1 | 0 | 1 | 0 | | 1 | 0 | 1 | 1 | | 1 | 0 | 0 | 1 | | 0 | 1 | 0 | 1 | 如何有效地构造加权图,以便: 节点对应于列名 如果两个顶点在数据帧的同一行中都有1,则它们是连接的 (例如,“a”与第一行的“c”相连) 权重等于两个顶点连接的次数(例如边“a”-“c”的权重为2,而“c”-“d”的权重为1) 以下是如何使用SimpleWig

给定以下数据帧:

| a | b | c | d |
|---|---|---|---|
| 1 | 0 | 1 | 0 |
| 1 | 0 | 1 | 1 |
| 1 | 0 | 0 | 1 |
| 0 | 1 | 0 | 1 |
如何有效地构造加权图,以便:

  • 节点对应于列名
  • 如果两个顶点在数据帧的同一行中都有1,则它们是连接的 (例如,“a”与第一行的“c”相连)
  • 权重等于两个顶点连接的次数(例如边“a”-“c”的权重为2,而“c”-“d”的权重为1)
以下是如何使用SimpleWightEdgraphs.jl和GraphPlot.jl手动构建此图:

g = SimpleWeightedGraph(4)
add_edge!(g,1,3,2)
add_edge!(g,1,4,2)
add_edge!(g,2,4,1)
add_edge!(g,3,4,1)
nodes = ["a","b","c","d"]
gplot(g,nodelabel=nodes,edgelinewidth=[2,2,1,1])

假设
df
是您的数据帧,类似的方法应该可以工作:

using LinearAlgebra

function gengraph(df)
    g = SimpleWeightedGraph(ncol(df))
    ew = Int[]
    for i in 1:ncol(df), j in i+1:ncol(df)
        w = dot(df[!, i], df[!, j])
        if w > 0
            push!(ew, w)
            add_edge!(g, i, j, w)
        end
    end
    gplot(g,nodelabel=names(df),edgelinewidth=ew)
end