Совокупное значение атрибута ребра или узла при спуске по объекту igraph

У меня есть объект 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 и 2) функцию aggregate в пакете data.tree.

Заранее спасибо за интерес и помощь.


person crawford    schedule 26.02.2017    source источник
comment
distances может быть полезно. distances(g, "0", weights=E(g)$dt)   -  person user20650    schedule 27.02.2017


Ответы (1)


Вы действительно можете использовать 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
person Christoph Glur    schedule 27.02.2017
comment
Благодарю вас! Это работает — сейчас я работаю над реализацией этого на объекте igraph с несколькими узлами, представляющими roots. - person crawford; 27.02.2017