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

Sum each list of numerical values within a list

我想将值附加到 R 中河图中的标签

我有一个值列表列表,需要它来显示节点之间的流,如下所示:

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

我知道一个函数可以减少(或求和)列表中的一个元素,如下所示: 减少(“+”,边$A)

有没有一种方法可以将这样的值列表减少到数据框,或者这样我就可以得到总和:

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

编辑:

我刚刚意识到有一个困惑: 看起来我需要两个输出,而且可能有点复杂: 1.如果'edges'列表有子列表有分类名,求和 2. 如果不是,则获取该项目所有出现次数的总和

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

很抱歉让您感到困惑。

我觉得你可以

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

这个returns一个列表。使用 sapply 会将结果简化为向量。

另一种选择是使用 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)).

我们也可以用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

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

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

# A  B  C 
#15 10 20