"Preserving" 具有内置函数的边缘属性

"Preserving" edge attributes with in built function

此 post 与

有关

post 的基本问题是如何通过普通转推用户连接节点。 @ThomasIsCoding 建议的代码确实有效。

我的后续问题是如何让这个函数存储边缘属性。我在下面提供了一个玩具示例:

我的初始数据框是以下形式:

author.id<-c("A","B","D")
rt_user<-c("C","C","C")
id<-c(1,2,3)

example<-data.frame(author.id,rt_user,id)

其中节点 A、B、D 从节点 C 转发推文,id 列是推文的数字分类器。在网络结构中使用它并应用上述功能导致:

g <- graph.data.frame(example, directed = T)
edge.attributes(g)
   gres <- do.call(
  graph.union,
  lapply(
    names(V(g))[degree(g, mode = "out") == 0],
    function(x) {
      nbs <- names(V(g))[distances(g, v = x, mode = "in") == 1]
      disjoint_union(
        set_vertex_attr(make_full_graph(length(nbs)), name = "name", value = nbs),
        set_vertex_attr(make_full_graph(1), name = "name", value = x)
      )
    }
  )
)

plot(gres)
edge.attributes(gres)

我的目标是在gres的最终转换中“保留”g的边缘属性。我想知道 A 使用了推文 1,B 使用了推文 2,D 使用了推文 3。我相信现在应该将它们从边属性转换为顶点属性,这样人们仍然知道谁是用户,哪条是推文,但我不确定关于如何将其合并到代码中。

您可以试试下面的代码

gres <- set_vertex_attr(gres,
    name = "id",
    value = E(g)$id[match(names(V(gres)), names(tail_of(g, E(g))))]
)

其中边属性是来自 tail_of 的特征顶点,您将看到

> V(gres)$id
[1]  1  2  3 NA