函数计算具有10个元素的向量的9个和(“连续元素”)

时间:2019-07-12 13:54:22

标签: r sum

假设我有一个向量

 test1 <- 1:10 

我想编写一个求和该向量的2个连续元素的值的函数。因此,输出将必定具有长度“ test1 -1”。

我在互联网上查找并发现大多数情况下带有循环的建议。我对R还是很陌生,但仍然没有真正了解循环的语法,而且,我想拥有一个函数,因为最后我真正想做的就是使用purrr包将此函数应用于更大的数据集。所以我真的只是在寻找这个简单函数的代码,以便以后可以在我的大型数据集中使用它。另外,我对“滚动窗口函数”有一些看法,这似乎很有希望,但是再次,我对R还是陌生的,我想保持简单。 “求和”功能不是我想要的,因为我对2个连续元素之间的总和感兴趣,而不是对所有元素的累加总和感兴趣。

我现在遇到的最大问题是,我不知道如何告诉R我实际上要求和的是连续位置而不是2个值(不太确定你是否明白我的意思)。我尝试了

之类的东西
sum_fun1 <- function(x) {
  [x] + [x+1]
}

但是在这种情况下,他没有得到x真正是指一个位置,而不是该位置/元素的内容。

非常感谢<3

2 个答案:

答案 0 :(得分:0)

您可以使用Zoo软件包中的rollapply功能:

library(zoo)
test1 <- 1:10
x <- rollapply(test1, 2, sum)

在这种情况下,第一个参数是您的数据,第二个参数是您正在考虑的滚动窗口的宽度(观察值的数量);在您的情况下,这是2,因为您要处理连续的总和。第三个参数是要应用于每个滚动窗口的函数,在这种情况下为sum。 您应该可以在功能中使用它。

答案 1 :(得分:0)

这是使用基数R的快速矢量化方法-

x <- 1:10

x[-length(x)] + x[-1]
[1]  3  5  7  9 11 13 15 17 19

或使用sapply-

sapply(seq_len(length(x) - 1), function(a) x[a] + x[a+1])
[1]  3  5  7  9 11 13 15 17 19

基准-

x <- 1:1e3

# I checked and all results below are identical

microbenchmark::microbenchmark(
  vector_add = x[-length(x)] + x[-1],
  sapply = sapply(seq_len(length(x) - 1), function(a) x[a] + x[a+1]),
  rollapply = zoo::rollapply(x, 2, sum)
)

Unit: microseconds
       expr    min      lq     mean  median      uq    max neval
 vector_add   12.5   14.70   17.247   17.05   18.55   42.7   100
     sapply  820.5  913.75  997.827  944.50  993.15 3407.1   100
  rollapply 5319.0 5733.35 6117.942 5909.85 6308.25 9270.8   100