【问题标题】:Sum each list of numerical values within a list对列表中的每个数值列表求和
【发布时间】:2016-06-27 13:17:55
【问题描述】:

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

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

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

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

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

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

编辑:

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

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

我很抱歉造成混乱。

【问题讨论】:

  • 您的编辑没有多大意义。
  • 它可能......我正在考虑它......我注意到 unlist(edges) 给了我 A.C A.E B.C C.D C.E 10 5 10 13 7 如果我能以某种方式只对之后的类别求和点...
  • 对不起,我意识到D、E节点不会用这种方法求和,可能需要另一种解决方案。这些是终端节点,它们不是主列表的一部分。它们是需要求和的子列表的项目。我试图描述我的编辑和主要问题中的困惑
  • 我接受了这个答案。我自己应该得到一个减号,非常抱歉没有看到这个问题。

标签: r riverplot


【解决方案1】:

我觉得你可以的

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

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

【讨论】:

  • 很抱歉我更正了我的问题。我忘了总结 D 和 E。我注意到 unlist 给了我 A.C A.E B.C C.D C.E 10 5 10 13 7 如果我能以某种方式仅对点后面的类别进行求和...
【解决方案2】:

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

【讨论】:

  • 很抱歉我更正了我的问题。我忘了总结 D 和 E。我注意到 unlist 给了我 A.C A.E B.C C.D C.E 10 5 10 13 7 如果我能以某种方式仅对点后面的类别进行求和...
  • @JacekKotowski 在这种情况下,您将不会获得“A”类别。你能解释一下你的预期输出吗?
  • @ZheyuanLi 也给你加一个。
  • @JacekKotowski 我更新了帖子以获得预期的效果,但我不确定这是什么情况。
  • stack 加一。不错的功能。
【解决方案3】:

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

【讨论】:

  • 很抱歉我更正了我的问题。我忘了总结 D 和 E。我注意到 unlist 给了我 A.C A.E B.C C.D C.E 10 5 10 13 7 如果我能以某种方式仅对点后面的类别进行求和...
【解决方案4】:

或者使用你自己提出的Reduce函数:

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

# A  B  C 
#15 10 20 

【讨论】:

    猜你喜欢
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 2020-04-25
    • 1970-01-01
    • 1970-01-01
    • 2012-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多