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

时间:2017-02-26 21:30:31

标签: r igraph edges cumulative-sum

我有一个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是边缘属性。这可以被认为是“父母”和“孩子”冰山之间的厚度变化(这是我的问题/项目)。

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

可视化:

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

节点和边缘属性'dt'

的示例

enter image description here

我需要在每个节点找到dt的累积总和,同时从父节点降到子节点。

在考虑“祖先”,“父”和“子”节点时,这相当于为每个'子节点'获取所有祖先的累计和dt

累积dt指定为边缘属性,预期结果示例

enter image description here

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

我已尝试过1 network.aggregate包中的RNewsflow功能&amp; 2)aggregate包中的data.tree函数。

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

1 个答案:

答案 0 :(得分:3)

你确实可以使用data.tree。虽然Aggregate会从孩子到父母的总结,但从我的理解,你想做相反的事情。所以以下内容将起作用:

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