【问题标题】:R: creating a 'statnet' network with node attributesR:创建具有节点属性的“statnet”网络
【发布时间】:2020-11-16 03:14:47
【问题描述】:

我正在按照此处的示例使用http://personal.psu.edu/drh20/papers/v24i09.pdf 中的“statnet”库。

第一个示例展示了如何在 R 中检查 statnet 网络对象:

library(statnet)
library(network)
 data("faux.magnolia.high") 
 fmh <- faux.magnolia.high 
summary(fmh)

在上面的例子中,这里似乎这个例子中的statnet网络已经有了“节点属性”。

使用 statnet 库,有谁知道是否有办法直接从数据帧中创建具有节点属性的网络?

例如,如果我有一些看起来像这样的数据:

mydata <-data.frame(

"source" = c("123","124","123","125","123"),
"target" = c("126", "123", "125", "122", "111"),
"color" = c("red","red","green","blue","red"),
"food" = c("pizza","pizza","cake","pizza","cake")
)

假设我有一个预定义的节点属性列表:

Nodes <-data.frame(

"source" = c("123","124","125","122","111", "126"),

"Country" = c("usa", "uk", "uk", "usa", "uk", "usa")

)

我尝试了以下代码:

net = network(mydata)

但我不确定这是否创建了具有节点属性(颜色和食物)的网络。

我也试过了,但是没用:

mydata <-data.frame(

"source" = c("123","124","123","125","123"), "target" = c("126", "123", "125", "122", "111"), "color" = c("red","red","green","blue","red"), "food" = c("pizza","pizza","cake","pizza","cake") )

Nodes <-data.frame(

"source" = c("123","124","125","122","111", "126"),

"Country" = c("usa", "uk", "uk", "usa", "uk", "usa")

)

net<-network(mydata[,c[1:2])

edges <- as.sociomatrix(mydata[,c(3:4)],simplify=TRUE)

nodes <- as.sociomatrix(Nodes,simplify=TRUE)

final <- as.sociomatrix(list(net,edges,nodes))

有人可以告诉我如何使用节点属性创建网络吗?

来源:https://rdrr.io/github/statnet/network/man/as.sociomatrix.html

谢谢

【问题讨论】:

标签: r graph nodes edges


【解决方案1】:

Igraph 是可以的,但如果你想留在网络包,即 statnet 套件中,你可以执行以下操作:

net<- as.network(mydata, matrix.type = "edgelist")
set.vertex.attribute(net, "color", as.character(mydata$color))
set.vertex.attribute(net, "food", as.character(mydata$food))
#To verify...
get.vertex.attribute(net, "color")

好像set.vertex.attribute函数不接受因子,所以as.character()

如果您有很多顶点属性,您可以使用“应用”将 set.vertex.attribute 作为函数应用到具有顶点属性的数据框的列上。

总的来说,Michael Heaney 的 statnet 套件材料(教程)对我非常有用(材料链接在标题“夏季研讨会”下的第一个项目符号中):http://michaeltheaney.com/teaching

【讨论】:

  • Lucic:谢谢您的回复!我有一个问题: mydata$color 和 mydata$food 是“边缘属性”。 “节点属性”是 Nodes$Country。我可以将您的代码更改为: set.vertex.attribute(net, "Country", as.character(Nodes$Country)) .... set_edge_attr(net, "color", as.character(mydata$color)) 吗?
  • Lucic:假设变量类型不是“因子”,你能写成:set.vertex.attribute(net, "income", as.numeric(mydata$income)) 吗?跨度>
  • @Noob 是的,您可以简单地更改代码。 set.edge.attribute 函数的工作方式与 set.vertex.attribute 相同。至于属性数据框中的向量类型,您始终可以使用 class() 检查它们的类。我怀疑你会把你的收入变量作为一个因素,但如果有必要,你可以随时检查和转换它。
  • 卢西奇:谢谢!您提供的第一行代码是否需要更改?而不是“ net
  • @Noob 不,不应该更改。 as.network 的第一个参数是网络关系上的数据,在您的情况下是边缘列表形式的 ('mydata')。更准确地说,只有前两列(“源”和“目标”)与边缘列表相关。您可以使用 get.vertex.attribute(net, "vertex.names") 检索顶点名称然后,如上所述设置进一步的顶点属性 (set.vertex.attribute(net, " country", as.character(Nodes$Country))) 表示按照向量get.vertex.attribute(net, "vertex.names")的顺序给节点分配属性值.
【解决方案2】:

这就是答案吗? https://igraph.org/r/doc/graph_from_data_frame.html

library(igraph)

g <- graph_from_data_frame(mydata, directed=TRUE, vertices=Nodes)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    相关资源
    最近更新 更多