【问题标题】:Summing sequences in r using data.table使用 data.table 对 r 中的序列求和
【发布时间】:2020-10-30 00:03:15
【问题描述】:

我正在尝试使用 r 中的 data.table 对一系列的片段求和。这个想法是我将开始索引和结束索引定义为表中的列,然后为“开始和结束索引之间的系列之和”创建第三列。

series = c(1,2,3,4,5,6)
a = data.table(start=c(1,2,3),end=c(4,5,6))
a[,S := sum(series[start:end])]
a

预期结果:

   start end  S
1:     1   4 10
2:     2   5 14
3:     3   6 18

实际结果:

Warning messages:
1: In start:end : numerical expression has 3 elements: only the first used
2: In start:end : numerical expression has 3 elements: only the first used
> a
   start end  S
1:     1   4 10
2:     2   5 10
3:     3   6 10

我在这里缺少什么?如果我只是执行 a[,S := start+end] 代码会按预期执行。

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    一个选项是用Map遍历'start'、'end'列,得到对应元素的序列(:),得到sumunlist list列分配 (:=) 到一个新列

    a[, S := unlist(Map(function(x, y) sum(x:y), start, end))]
    

    -输出

    a
    #   start end  S
    #1:     1   4 10
    #2:     2   5 14
    #3:     3   6 18
    

    : 的操作数没有被矢量化,即它的两边只需要一个操作数,这就是它显示警告的原因

    【讨论】:

      【解决方案2】:

      也许你可以试试下面的cumsum,它允许你在data.table中应用矢量化操作

      cs <- cumsum(series)
      a[,S := cs[end]-c(0,cs)[start]]
      

      给了

         start end  S
      1:     1   4 10
      2:     2   5 14
      3:     3   6 18
      

      【讨论】:

        【解决方案3】:

        你可以使用算术级数公式:

        a[, S := (end - start + 1) * (start + end) / 2]
        

        给予:

           start end  S
        1:     1   4 10
        2:     2   5 14
        3:     3   6 18
        

        【讨论】:

          【解决方案4】:

          如果您将其设为按行操作,您的代码将可以工作,因此每个 startend 一次代表一个值。

          library(data.table)
          a[,S := sum(series[start:end]), 1:nrow(a)]
          a
          
          #   start end  S
          #1:     1   4 10
          #2:     2   5 14
          #3:     3   6 18
          

          【讨论】:

            猜你喜欢
            • 2012-10-17
            • 1970-01-01
            • 2015-12-08
            • 2020-09-12
            • 2014-03-18
            • 2018-11-15
            • 1970-01-01
            • 1970-01-01
            • 2021-12-13
            相关资源
            最近更新 更多