我有一个向量,我需要对每个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)
一种方法是将矢量转换为matric,然后取列总和:
colSums(matrix(v, nrow=n))
[1] 55 155 255 355 455 555 655 755 855 955
Run Code Online (Sandbox Code Playgroud)
请注意:这隐含地假设您的输入向量实际上可以重新整形为矩阵.如果不能,R将回收矢量元素以完成矩阵.