【问题标题】:Take the product of rows in a matrix by group in R在R中按组取矩阵中行的乘积
【发布时间】:2021-10-14 09:42:03
【问题描述】:

我正在寻找一种方法来基本上完成 rowsum 函数所做的事情,除了取积而不是总和。

假设我有矩阵 a 和一个分组 ID 向量 group

a <- matrix(seq(12), ncol = 2)
group <- c(1, 1, 2, 2, 3, 3)

我可以使用rowsum(a, group)逐组获取每一行的总和:

rowsum(a, group)
  [,1] [,2]
1    3   15
2    7   19
3   11   23

如何按组获取每一行的产品,这将给出:

  [,1] [,2]
1    2   56
2   12   90 
3   30  132

【问题讨论】:

    标签: r performance matrix


    【解决方案1】:

    对行的乘积我没有得到相同的结果

    a <- matrix(seq(12), ncol = 2)
    group <- c(1, 1, 2, 2, 3, 3)
    
    rowsum(a, group)
    #>   [,1] [,2]
    #> 1    3   15
    #> 2    7   19
    #> 3   11   23
    
    matrixStats::rowProds(a,group)
    #> [1]  7  7 16 16 27 27
    

    reprex package (v2.0.1) 于 2021-08-10 创建

    【讨论】:

    • 我不确定matrixStats::rowProds 函数是否与我描述的相同。看起来它将产品跨越每一列而不是每一行。
    【解决方案2】:

    对于a &gt; 0 的值,您可以使用

    exp(rowsum(log(a), group))
    
    #>    [,1] [,2]
    #> 1    2   56
    #> 2   12   90
    #> 3   30  132
    

    这是基于

    的解决方案
    a * b = exp(log(a * b)) = exp(log(a) + log(b))
    

    【讨论】:

    • 噢,非常聪明。我认为这可以做到。有人应该写一个 rowprod 函数来做这个。
    • 出色的解决方案,+1!
    • 如果有任何值&lt;= 0
    • @Henrik 你是完全正确的。我没有想到那个案子。
    【解决方案3】:

    base R 中,aggregate 应该也可以工作

    aggregate(a, list(group), FUN = prod)[-1]
      V1  V2
    1  2  56
    2 12  90
    3 30 132
    

    或者另一个选项是fprod from collapse

    library(collapse)
    fprod(a, g = group)
      [,1] [,2]
    1    2   56
    2   12   90
    3   30  132
    

    【讨论】:

    • 很棒的aggregate 解决方案,大大简化了!
    【解决方案4】:

    你可以试试apply + tapply + prod

    > apply(a, 2, tapply, group, prod)
      [,1] [,2]
    1    2   56
    2   12   90
    3   30  132
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多