1

这是上一个问题之后的一个问题。在该问题中,建议使用rollapply计算1st, 2nd, 3rd向量条目的总和;然后2nd, 3rd, 4th; 等等。

我的问题是如何计算1st, 2nd and 3rd; 然后4th, 5th and 6th. 即滚动不重叠。请问这个可以轻松搞定吗?

4

4 回答 4

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 
于 2017-04-21T08:22:13.667 回答
3

tapply在基础 R 中使用:

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

vec[1:(ceiling(length(vec)/3)*3)]NA如果长度不能被 3 整除,则用向量填充。然后,您只需忽略NAs 中的 s colSums


还有一个使用cutand 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
于 2017-04-21T08:15:35.400 回答
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]))

ps 使用来自@Sotos 答案的输入

于 2017-04-21T08:24:10.467 回答
1

我们可以使用roll_sumfrom RcppRollwhich 将非常有效

library(RcppRoll)
roll_sum(x, n=3)[c(TRUE, FALSE, FALSE)]
#[1] 10 20 12

数据

x <-c(1, 5, 4, 5, 7, 8, 9, 2, 1)
于 2017-04-21T08:25:35.227 回答