【问题标题】:Sum across list elements whose sub-elements have the same name对具有相同名称的子元素的列表元素求和
【发布时间】:2020-06-25 13:21:57
【问题描述】:

重现最小工作示例的列表

假设我有一个这样的列表

a <- list(
    list(
        a=matrix(c(1, 2)), 
        b=matrix(c(1,2,1,2), ncol=2)),
    list(
        a=matrix(c(3, 5)), 
        b=matrix(c(5,2,7,1), ncol=2))
)

基本上是这样的

[[1]]
[[1]]$a
     [,1]
[1,]    1
[2,]    2

[[1]]$b
     [,1] [,2]
[1,]    1    1
[2,]    2    2


[[2]]
[[2]]$a
     [,1]
[1,]    3
[2,]    5

[[2]]$b
     [,1] [,2]
[1,]    5    7
[2,]    2    1

所需的输出

对于a 的每个元素,我希望找到正确名称的总和。在这种情况下,我希望能够得到与此类似的输出(尽管不需要是列表)

$a
     [,1]
[1,]    4
[2,]    7

$b
     [,1] [,2]
[1,]    6    8
[2,]    4    3

获得此输出的最快方法是什么?我可以使用 for 循环来做到这一点,但我确信一定有更好的方法。

【问题讨论】:

    标签: r arrays list


    【解决方案1】:

    使用transpose 交换内部和外部列表。然后用mapreduce总结一下。

    library(purrr)
    
    a %>%
      transpose %>%
      map(~ reduce(., `+`))
    
    # $a
    #      [,1]
    # [1,]    4
    # [2,]    7
    # 
    # $b
    #      [,1] [,2]
    # [1,]    6    8
    # [2,]    4    3
    

    【讨论】:

      【解决方案2】:

      在基础 R 中你可以做到。

      Map(function(i) a[[1]][[i]] + a[[2]][[i]], el(Map(names, a)))
      

      或者,更一般地

      sapply(el(Map(names, a)), function(i) Reduce(`+`, mapply(`[`, a, i)))
      # $a
      #      [,1]
      # [1,]    4
      # [2,]    7
      # 
      # $b
      #      [,1] [,2]
      # [1,]    6    8
      # [2,]    4    3
      

      【讨论】:

      • 我假设列表可能有很多元素
      • @Euler_Salter 现在好点了吗?
      猜你喜欢
      • 2018-06-15
      • 2023-03-29
      • 1970-01-01
      • 2020-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-14
      • 2011-12-17
      相关资源
      最近更新 更多