我想将值附加到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(这些是河流图中的末端节点)
我很抱歉这个混乱。
答案 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