对列表中的每个数值列表求和
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
我想将值附加到 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