繁体   English   中英

使用 data.table 对 r 中的序列求和

[英]Summing sequences in r using data.table

我正在尝试使用 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] 代码会按预期执行。

一种选择是遍历有“开始”,“结束”列Map ,获得序列( : )对应的元素,得到的sumunlistlist列分配( := )到一个新列

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

:没有针对其操作数进行向量化,即它在任一侧只需要一个操作数,这就是它显示警告的原因

也许您可以尝试像下面这样的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

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

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

给出:

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

如果您将其设为按行操作,则您的代码将起作用,因此每个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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM