【问题标题】:How to calculate consecutive sum in R? [duplicate]如何计算R中的连续总和? [复制]
【发布时间】:2014-02-11 15:08:57
【问题描述】:

例如,如果我有一个数字向量。

c(1:9)

现在,如果我想通过以下方式计算三个连续数字的总和:

(1+2+3,4+5+6,7+8+9)

我应该如何处理?

【问题讨论】:

  • 最好使用colSums(matrix(1:9,nrow=3)) 而不是rowSums(matrix(1:9,nrow=3, byrow=TRUE))
  • 我喜欢游戏 :) sapply(0:2, function(x) sum(c(1:9)[(3*x+1):(3*x+3)])) 给:6 15 24
  • 这些都没有条件语句。 @BenBolker 你需要colSums
  • 这里还有更多:tapply(1:9, (seq_along(1:9)-1) %/% 3 , sum)library(zoo); rollapply(1:9, 3, sum, by = 3)
  • 有人可以把这个放到codegolf.stackexchange.com ...

标签: r sum


【解决方案1】:

我学会了正确使用这个:

foo<-1:9
aggregate(foo,by=list(rep(1:3,each=3) ),FUN=sum)

对于更长的输入,请执行以下操作:

function (x,len) aggregate(x,by=list(rep(1:(length(x)/len),each=len) ),FUN=sum)

因为我仍在等待 what-if.xkcd.com 更新,所以时间安排如下: (而且我确实检查过所有的计算都是正确的)

x<-1:99
len<-3
 microbenchmark(shadow(x,len),rawr(x,len),groth(x,len),carl(x,len),times=10)
Unit: microseconds
           expr      min       lq    median       uq      max
 shadow(x, len)   62.006   70.130   75.0480   97.926  180.884
   rawr(x, len)  541.797  564.033  571.9445  585.842  639.295
  groth(x, len)  514.002  525.548  547.5705  551.633  568.310
   carl(x, len) 1045.536 1099.844 1120.5840 1166.553 1346.582
 neval
    10
    10
    10
    10

所以matrix -- colSums 是最快的。我将把它留给其他人来确定每种方法的内存要求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    • 2020-12-04
    • 2018-11-17
    • 2021-05-08
    • 2021-11-29
    • 2012-10-18
    相关资源
    最近更新 更多