【问题标题】:Keeping edge values in graph after converting it to a network object in R在将其转换为 R 中的网络对象后将边缘值保留在图中
【发布时间】:2013-03-25 20:01:44
【问题描述】:

注意 1:我使用的是 R 包“network”和“sna”

注意 2:我的原始数据是 .csv 文件中的 edgelist 格式。

我一直在寻找将边缘列表数据读入 R 的最佳方法。乍一看,这很简单。

data <- read.csv("file.CSV", header=F)
network <- network(data, matrix.type="edgelist", directed=F) #convert data to network object
val<-data[,3] #here are the values for my edges
set.edge.value(network, "val", val, e=1:length(network$mel))

当我要求网络返回边缘值 (get.edge.values) 时,它会返回正确的值。

但是,当我问summary(network) 时,它只返回一个邻接矩阵,其中所有值都设置为 1(对角线除外)。即使它们的值为零,它们的值也是 1。

此外,尝试获得像 degree(network) 这样的东西会返回错误的结果。

我一直在寻找这几天。一个可能的解决方案是使用network2&lt;-as.matrix.network(netwerk1, matrix.type="adjacency", attrname="val")。这行得通。然而,问题是它不再是一个网络对象,而是一个矩阵类。结果,我无法向网络添加顶点属性。再次将 network2 转换回网络对象会丢失网络中的边缘值。

我们将不胜感激。

最好, 弗雷德里克

【问题讨论】:

    标签: r graph social-networking adjacency-matrix sna


    【解决方案1】:

    看起来您回答了自己的问题:将网络对象转换为矩阵时,您需要包含 attrname 参数来告诉 as.matrix.network 哪个属性用于权重。如果它已经是一个网络对象,你能解释一下为什么需要将它转换回网络对象吗?

    sna 中的degree 函数没有参数来告诉它要使用哪个边缘属性,因此您必须向它传递一个具有权重的矩阵。

    > library(network)
    > library(sna)
    > net<-network.initialize(3)
    > add.edges(net,c(1,2,3),c(2,3,1))
    > set.edge.attribute(net,'weight',c(5,6,7))
    > as.matrix(net,matrix.type='adjacency',attrname='weight')
      1 2 3
    1 0 5 0
    2 0 0 6
    3 7 0 0
    > netmat<-as.matrix(net,matrix.type='adjacency',attrname='weight')
    > degree(net)
    [1] 2 2 2
    > degree(netmat)
    [1] 12 11 13
    

    所以在你的情况下,

    degree(network2) 
    

    应该可以。

    【讨论】:

    • 嗯,想要一个网络对象的原因是我可以在它上面运行网络相关的功能。使用 as.matrix.network 不会产生网络对象。但是,我确实找到了使用 igraph 包的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    • 2019-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-16
    相关资源
    最近更新 更多