这是前一个one之后的问题。在该问题中,建议使用rollapply
来计算向量的1st, 2nd, 3rd
条目的总和;然后2nd, 3rd, 4th
;等等。
我的问题是如何计算1st, 2nd and 3rd
的总和;那么4th, 5th and 6th
。也就是说,滚动没有重叠。这可以轻松完成吗?
答案 0 :(得分:6)
同样的想法。您只需要指定by参数。默认值为1。
x <-c(1, 5, 4, 5, 7, 8, 9, 2, 1)
zoo::rollapply(x, 3, by = 3, sum)
#[1] 10 20 12
#or another Base R option
sapply(split(x, ceiling(seq_along(x)/3)), sum)
# 1 2 3
#10 20 12
答案 1 :(得分:3)
在基础R中使用tapply
:
set.seed(1)
vec <- sample(10, 20, replace = TRUE)
#[1] 3 4 6 10 3 9 10 7 7 1 3 2 7 4 8 5 8 10 4 8
unname(tapply(vec, (seq_along(vec)-1) %/% 3, sum))
# [1] 13 22 24 6 19 23 12
可替换地,
colSums(matrix(vec[1:(ceiling(length(vec)/3)*3)], nrow = 3), na.rm = TRUE)
#[1] 13 22 24 6 19 23 12
如果长度不能被3整除,则 vec[1:(ceiling(length(vec)/3)*3)]
会使用NA
填充向量。然后,您只需忽略NA
中的colSums
。
又一个使用cut
和aggregate
:
x <- ceiling(length(vec)/3)*3
df <- data.frame(vec=vec[1:x], col=cut(1:x, breaks = seq(0,x,3)))
aggregate(vec~col, df, sum, na.rm = TRUE)[[2]]
#[1] 13 22 24 6 19 23 12
答案 2 :(得分:1)
您可以定义窗口大小,并执行:
x <-c(1, 5, 4, 5, 7, 8, 9, 2, 1)
n <- 3
diff(c(0, cumsum(x)[slice.index(x, 1)%%n == 0]))
P.S。使用@Sotos答案中的输入
答案 3 :(得分:1)
我们可以使用来自roll_sum
的{{1}}非常有效
RcppRoll
library(RcppRoll)
roll_sum(x, n=3)[c(TRUE, FALSE, FALSE)]
#[1] 10 20 12