0

注 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<-as.matrix.network(netwerk1, matrix.type="adjacency", attrname="val"). 这行得通。然而,问题是它不再是一个网络对象,而是一个矩阵类。结果,我无法向网络添加顶点属性。再次将 network2 转换回网络对象会丢失网络中的边缘值。

一些帮助将不胜感激。

最好的,弗雷德里克

4

1 回答 1

0

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

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

> 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) 

应该管用。

于 2013-03-28T16:08:19.190 回答