对列表中的每个数值列表求和

时间:2016-06-27 13:17:55

标签: r riverplot

我想将值附加到R

中河流图中的标签

我有一个值列表列表,这是显示节点之间流的必要条件,如下所示:

edges <- list( A= list( C= 10, E= 5 ), 
               B= list( C= 10 ), 
               C=list(D = 13, E = 7 )) 

我知道一个函数会减少(或求和)列表中的一个元素,如下所示: 减少(&#34; +&#34;,边缘$ A)

有没有办法将这样的值列表减少到数据帧,或者我可以得到总和:

Node Sum
A 15
B 10
C 20
D 13
E 12 

编辑:

我刚才意识到存在一种困惑: 看起来我需要两个输出,它可能有点复杂:  1.如果&#39;边缘&#39; list有一个带有类别名称的子列表,总结  2.如果没有,获得该项目所有出现的总和

案例1:类别A,B,C(这些是起始节点) 案例2:类别D,E(这些是河流图中的末端节点)

我很抱歉这个混乱。

4 个答案:

答案 0 :(得分:5)

我认为你可以做到

lapply(edges, function (x) sum(unlist(x)))

返回一个列表。使用sapply会将结果简化为矢量。

答案 1 :(得分:3)

我们也可以使用base R

 v1 <- unlist(edges)
 tapply(v1, sub("\\..*", "", names(v1)), sum)
 # A  B  C 
 #15 10 20 

或者只需一步

 r1 <- tapply(unlist(edges), rep(names(edges), lengths(edges)), FUN = sum)
 r1
 # A  B  C 
 #15 10 20 

如果我们需要sum基于names之后的.

 r2 <- tapply(v1, sub("[^.]+\\.", "", names(v1)), FUN = sum)
 r2
 # C  D  E 
 #20 13 12 

 c(r1, r2)[!duplicated(c(names(r1), names(r2)))]
 # A  B  C  D  E 
 #15 10 20 13 12 

或使用aggregate/stack

aggregate(values~., stack(edges), FUN = sum)
#    ind values
#1   A     15
#2   B     10
#3   C     20

答案 2 :(得分:1)

另一个选择是使用purrr包:

library(purrr)
stack(map(edges, compose(sum, unlist)))
#   values ind
# 1     15   A
# 2     10   B
# 3     20   C 

其中compose(sum, unlist)相当于function(x) sum(unlist(x))

答案 3 :(得分:1)

或使用您自己建议的Reduce函数:

unlist(lapply(edges, function(a) Reduce(sum, a)))

# A  B  C 
#15 10 20