每第n个点求和

Ale*_*lex 18 r sum apply

我有一个向量,我需要对每个n数字求和并返回结果.这是我计划当前这样做的方式.有更好的方法吗?

v = 1:100
n = 10
sidx = seq.int(from=1, to=length(v), by=n)
eidx = c((sidx-1)[2:length(sidx)], length(v))
thesum = sapply(1:length(sidx), function(i) sum(v[sidx[i]:eidx[i]]))
Run Code Online (Sandbox Code Playgroud)

这给出了:

thesum
 [1]  55 155 255 355 455 555 655 755 855 955
Run Code Online (Sandbox Code Playgroud)

Jos*_*ien 28

unname(tapply(v, (seq_along(v)-1) %/% n, sum))
# [1] 55 155 255 355 455 555 655 755 855 955 
Run Code Online (Sandbox Code Playgroud)


Ric*_*rta 16

更新:

如果要对每n个连续数字求和,请使用colSums
如果要对每个第n个数字求和rowSums

根据约什的评论,这只有在n划分length(v)得很好的情况下才有效.

rowSums(matrix(v, nrow=n))
 [1] 460 470 480 490 500 510 520 530 540 550

colSums(matrix(v, nrow=n))
 [1]  55 155 255 355 455 555 655 755 855 955
Run Code Online (Sandbox Code Playgroud)


ags*_*udy 12

更新

olde版本不起作用.这里是一个rep用于创建分组因子的新手.无需使用cut:

n <- 5 
vv <- sample(1:1000,100)
seqs <- seq_along(vv)
tapply(vv,rep(seqs,each=n)[seqs],FUN=sum)
Run Code Online (Sandbox Code Playgroud)

您可以使用 tapply

tapply(1:100,cut(1:100,10),FUN=sum)
Run Code Online (Sandbox Code Playgroud)

或者获得一份清单

by(1:100,cut(1:100,10),FUN=sum)
Run Code Online (Sandbox Code Playgroud)

编辑

如果你有1:92,你可以用这个替换你的切口:

cut(1:92,seq(1,92,10),include.lowest=T)
Run Code Online (Sandbox Code Playgroud)


And*_*rie 7

一种方法是将矢量转换为matric,然后取列总和:

colSums(matrix(v, nrow=n))
[1]  55 155 255 355 455 555 655 755 855 955
Run Code Online (Sandbox Code Playgroud)

请注意:这隐含地假设您的输入向量实际上可以重新整形为矩阵.如果不能,R将回收矢量元素以完成矩阵.