下降 igraph 对象时边缘或节点属性的累积值

Cumulative value of an edge or node attribute while descending an igraph object

我有一个 igraph 对象 g 由数据框 df:

df <- data.frame(c(0,1,2,2,4), c(1,2,3,4,5), c(0.01, 0.03, 0.05, 0.01, 0.02))
colnames(df) <- c('parent_id', 'id', 'dt')
g <- graph_from_data_frame(df)

边缘在 parent_idid 之间。

> g
IGRAPH DN-- 6 5 -- 
+ attr: name (v/c), dt (e/n)
+ edges (vertex names):
[1] 0->1 1->2 2->3 2->4 4->5

厚度变化dt是边缘属性。这可以认为是 'parent' 和 'child' 冰山之间的厚度变化(这是我的 problem/project)。

list.edge.attributes(g)
[1] "dt"

可视化:

plot(g, edge.label=E(g)$dt)

节点和边属性示例'dt'

我需要在从父节点到子节点的每个节点上找到 dt 的累加和。

当考虑 'ancestor'、'parent' 和 'child' 节点时,这相当于在每个 'child' 节点。

累计 dt 分配为边缘属性,预期结果示例

如果将这些累积值分配为新的节点或边缘属性,或其他形式的输出,则可以。

我试过 1) RNewsflow 包中的 network.aggregate 函数 & 2) data.tree 包中的 aggregate 函数。

提前感谢您的关注和帮助。

您确实可以为此使用 data.tree。虽然 Aggregate 会从 children 向 parent 求和,但据我了解,你想做相反的事情。所以以下将起作用:

library(data.tree)
df <- get.data.frame(g, what = "edges")
dtr <- FromDataFrameNetwork(df)
dtr$dtcum <- 0
dtr$Do(function(node) node$dtcum <- node$parent$dtcum + node$dt, filterFun = isNotRoot)
print(dtr, "dt", "dtcum")

这将打印为:

          levelName   dt dtcum
1 0                   NA  0.00
2  °--1             0.01  0.01
3      °--2         0.03  0.04
4          ¦--3     0.05  0.09
5          °--4     0.01  0.05
6              °--5 0.02  0.07