我正在尝试从数据树结构中计算出小时数.我可以直接在父节点下添加小时数,但是我不能包括分配给树中父节点的小时数.任何建议都会很棒.
这就是我得到的:
levelName小时总时数
1 Ned NA 1
2° – 约翰1 3
3° – 凯特1 3
4 | – 丹1 1
5 | – 罗恩1 1
6° – 西耶娜1 1
这就是我要找的东西:
levelName小时totalHours
1 Ned NA 5
2° – 约翰1 5
3° – 凯特1 4
4 | – 丹1 1
5 | – 罗恩1 1
6° – 西耶娜1 1
这是我的代码:
# Install package install.packages('data.tree') library(data.tree) # Create data frame to <- c("Ned","John","Kate","Kate") from <- c("John","Dan","Ron","Sienna") hours <- c(1,1,1) df <- data.frame(from,to,hours) # Create data tree tree <- FromDataFrameNetwork(df) print(tree,"hours") # Get running total of hours that includes all nodes and children values. tree$Do(function(x) x$total <- Aggregate(x,"hours",sum),traversal = "post-order") print(tree,runningtotal = tree$Get(Aggregate,"total",sum))
你可以简单地使用递归函数:
原文链接:https://www.f2er.com/javaschema/281468.htmlmyApply <- function(node) { node$totalHours <- sum(c(node$hours,purrr::map_dbl(node$children,myApply)),na.rm = TRUE) } myApply(tree) print(tree,"totalHours")
结果:
levelName hours totalHours 1 Ned NA 5 2 °--John 1 5 3 °--Kate 1 4 4 ¦--Dan 1 1 5 ¦--Ron 1 1 6 °--Sienna 1 1
编辑:填写两个元素:
# Create data frame to <- c("Ned",1) hours2 <- 5:1 df <- data.frame(from,hours,hours2) # Create data tree tree <- FromDataFrameNetwork(df) print(tree,"hours2") myApply <- function(node) { res.ch <- purrr::map(node$children,myApply) a <- node$totalHours <- sum(c(node$hours,purrr::map_dbl(res.ch,1)),na.rm = TRUE) b <- node$totalHours2 <- sum(c(node$hours2,2)),na.rm = TRUE) list(a,b) } myApply(tree) print(tree,"totalHours","hours2","totalHours2")
结果:
levelName hours totalHours hours2 totalHours2 1 Ned NA 5 NA 15 2 °--John 1 5 5 15 3 °--Kate 1 4 4 10 4 ¦--Dan 1 1 3 3 5 ¦--Ron 1 1 2 2 6 °--Sienna 1 1 1 1