我有一个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_id
和id
之间。
> 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'
我需要在每个节点找到dt
的累积总和,同时从父节点降到子节点。
在考虑“祖先”,“父”和“子”节点时,这相当于为每个'子节点'获取所有祖先的累计和dt
。
累积dt
指定为边缘属性,预期结果示例
如果将这些累积值指定为新节点或边缘属性或其他形式的输出,则可以。
我已尝试过1 network.aggregate
包中的RNewsflow
功能&amp; 2)aggregate
包中的data.tree
函数。
提前感谢您的关注和帮助。
答案 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