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

升序igraph对象时边或节点属性的累积值,r,igraph,R,Igraph,从这以后 我想对每个节点“上游”的所有节点求和。与上面问题的答案不同,这个问题的计算是从父代到子代的最短路径,我想将所有子代到父代的所有值相加。在河流环境中:从下游集水区到集水区所有集水区上游 我的输入数据 input <- structure(list(ZHYD = c("B030000156", "B030000159", "B030000165", "B030000167", "B030000170", "B030000171", "B030000175", "B030000177

从这以后

我想对每个节点“上游”的所有节点求和。与上面问题的答案不同,这个问题的计算是从父代到子代的最短路径,我想将所有子代到父代的所有值相加。在河流环境中:从下游集水区到集水区所有集水区上游

我的输入数据

input <- structure(list(ZHYD = c("B030000156", "B030000159", "B030000165", 
"B030000167", "B030000170", "B030000171", "B030000175", "B030000177", 
"B030000181", "B030000183", "B030000184", "B030000190", "B030000192", 
"B030000193", "B030000195", "B030000196", "B030000197", "B030000198", 
"B030000199", "B030000201", "B030000202", "B030000133", "B030000191"
), NextDown = c("B030000133", "B030000133", "B030000159", "B030000159", 
"B030000167", "B030000167", "B030000170", "B030000175", "B030000175", 
"B030000171", "B030000170", "B030000171", "B030000184", "B030000191", 
"B030000197", "B030000197", "B030000191", "B030000190", "B030000190", 
"B030000199", "B030000199", "OUTLET", "B030000184"), count = c(2, 
0, 2, 0, 0, 0, 2, 3, 0, 0, 1, 0, 1, 2, 1, 0, 7, 0, 0, 0, 0, 5, 
0), Exutoire = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L), Outlet = c("BSO0000016", 
"BSO0000016", "BSO0000016", "BSO0000016", "BSO0000016", "BSO0000016", 
"BSO0000016", "BSO0000016", "BSO0000016", "BSO0000016", "BSO0000016", 
"BSO0000016", "BSO0000016", "BSO0000016", "BSO0000016", "BSO0000016", 
"BSO0000016", "BSO0000016", "BSO0000016", "BSO0000016", "BSO0000016", 
"BSO0000016", "BSO0000016"), EcrRiv_km = c(54.91, 5.14, 37.71, 
8.28, 17.22, 5.6, 45.87, 84.1, 26.22, 43.29, 32.49, 43.85, 35.1, 
11.09, 67.88, 32.66, 102.71, 18.21, 0.81, 14.05, 16.27, 45.44, 
3.47), EcrRivCoun = c(20, 3, 18, 5, 9, 3, 29, 44, 16, 18, 18, 
19, 16, 10, 30, 19, 56, 12, 3, 11, 10, 13, 5), DFLS = c(0.5, 
1, 0.5, 1, 1, 1, 0.5, 0.333333333333333, 1, 1, 1, 1, 1, 0.5, 
1, 1, 0.142857142857143, 1, 1, 1, 1, 0.2, 1), density = c(27.455, 
0, 18.855, 0, 0, 0, 22.935, 28.0333333333333, 0, 0, 32.49, 0, 
35.1, 5.545, 67.88, 0, 14.6728571428571, 0, 0, 0, 0, 9.088, 0
), dendritic_r = c(2.7455, 1.71333333333333, 2.095, 1.656, 1.91333333333333, 
1.86666666666667, 1.58172413793103, 1.91136363636364, 1.63875, 
2.405, 1.805, 2.30789473684211, 2.19375, 1.109, 2.26266666666667, 
1.71894736842105, 1.83410714285714, 1.5175, 0.27, 1.27727272727273, 
1.627, 3.49538461538462, 0.694)), class = c("tbl_df", "tbl", 
"data.frame"), row.names = c(NA, -23L), .Names = c("ZHYD", "NextDown", 
"count", "Exutoire", "Outlet", "EcrRiv_km", "EcrRivCoun", "DFLS", 
"density", "dendritic_r"))

input我想您可能正在寻找
子组件

> subcomponent(g,"B030000156","out")
+ 3/24 vertices, named, from 8540f89:
[1] B030000156 B030000133 OUTLET    

> subcomponent(g,"B030000196","out")
+ 9/24 vertices, named, from 8540f89:
[1] B030000196 B030000197 B030000191 B030000184 B030000170 B030000167 B030000159 B030000133 OUTLET   
如果您想转到其他(或两个)方向,也可以使用
中的
all
作为修饰符。如果使用
sapply
,则可以迭代所有节点:

> sapply(V(g),subcomponent,graph=g,mode="out")
$B030000156
+ 3/24 vertices, named, from 8540f89:
[1] B030000156 B030000133 OUTLET    

$B030000159
+ 3/24 vertices, named, from 8540f89:
[1] B030000159 B030000133 OUTLET    

$B030000165
+ 4/24 vertices, named, from 8540f89:
[1] B030000165 B030000159 B030000133 OUTLET
... the rest are truncated
您可以将路径上的所有权重相加,如下所示:

> E(g)$weight=as.numeric(df[,3])
> sum(E(g,path=c("B030000159","B030000133","OUTLET"))$weight)
[1] 5
以下是从igraph对象提取节点名称后沿路径获取权重总和的一种迂回方法:

library(stringr)
paths <- sapply(V(g),subcomponent,graph=g,mode="out")
z <- capture.output(paths)  # forcefully yank output from igraph object
pathlist <- z[which(str_detect(z,"[1] "))]
您还可以将所有下游路径提取到数据帧中:

> library(stringi)
> paths.df <- as.data.frame(stri_extract_all_words(pathlist, simplify = TRUE))
> head(paths.df)
  V1         V2         V3         V4         V5         V6         V7         V8         V9    V10
1  1 B030000171 B030000167 B030000159 B030000133     OUTLET                                        
2  1 B030000181 B030000175 B030000170 B030000167 B030000159 B030000133 OUTLET                  
3  1 B030000183 B030000171 B030000167 B030000159 B030000133     OUTLET                             
4  1 B030000190 B030000171 B030000167 B030000159 B030000133     OUTLET                             
5  1 B030000193 B030000191 B030000184 B030000170 B030000167 B030000159 B030000133     OUTLET       
6  1 B030000195 B030000197 B030000191 B030000184 B030000170 B030000167 B030000159 B030000133 OUTLET
>库(stringi)
>paths.df头(paths.df)
V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
1 1 B030000171 B030000167 B030000159 B030000133出口
2 1 B030000181 B030000175 B030000170 B030000167 B030000159 B03000013出口
3 1 B030000183 B030000171 B030000167 B030000159 B030000133出口
4 1 B030000190 B030000171 B030000167 B030000159 B030000133插座
5 1 B030000193 B030000191 B030000184 B030000170 B030000167 B030000159 B030000133出口
6 1 B030000195 B030000197 B030000191 B030000184 B030000170 B030000167 B030000159 B03000013出口

这是一个良好的开端,但在路径列表跨越两行以上的情况下,它不起作用。e、 g.
路径
library(stringr)
paths <- sapply(V(g),subcomponent,graph=g,mode="out")
z <- capture.output(paths)  # forcefully yank output from igraph object
pathlist <- z[which(str_detect(z,"[1] "))]
> sum(E(g,path=unlist(strsplit(pathlist[1],"\\s+"))[2:length(unlist(strsplit(pathlist[1],"\\s+")))])$weight)
[1] 5     

> sum(E(g,path=unlist(strsplit(pathlist[13],"\\s+"))[2:length(unlist(strsplit(pathlist[13],"\\s+")))])$weight)
[1] 6
> library(stringi)
> paths.df <- as.data.frame(stri_extract_all_words(pathlist, simplify = TRUE))
> head(paths.df)
  V1         V2         V3         V4         V5         V6         V7         V8         V9    V10
1  1 B030000171 B030000167 B030000159 B030000133     OUTLET                                        
2  1 B030000181 B030000175 B030000170 B030000167 B030000159 B030000133 OUTLET                  
3  1 B030000183 B030000171 B030000167 B030000159 B030000133     OUTLET                             
4  1 B030000190 B030000171 B030000167 B030000159 B030000133     OUTLET                             
5  1 B030000193 B030000191 B030000184 B030000170 B030000167 B030000159 B030000133     OUTLET       
6  1 B030000195 B030000197 B030000191 B030000184 B030000170 B030000167 B030000159 B030000133 OUTLET