[英]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
,获得序列( :
)对应的元素,得到的sum
与unlist
的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
:
没有针对其操作数进行向量化,即它在任一侧只需要一个操作数,这就是它显示警告的原因
也许您可以尝试像下面这样的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
如果您将其设为按行操作,则您的代码将起作用,因此每个start
和end
代表一个值。
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.