3

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

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

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

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

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

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

编辑:

我刚刚意识到有一个困惑:看起来我需要两个输出,它可能有点复杂:1.如果'edges'列表有一个带有类别名称的子列表,求和 2.如果没有,得到总和该项目的所有出现

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

我很抱歉造成混乱。

4

4 回答 4

5

我认为你可以做到

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

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

于 2016-06-27T13:20:56.823 回答
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
于 2016-06-27T13:47:04.693 回答
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))

于 2016-06-27T13:28:09.910 回答
1

或使用您自己提出的Reduce功能:

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

# A  B  C 
#15 10 20 
于 2016-06-27T14:35:29.020 回答