假设我有一个向量
test1 <- 1:10
我想编写一个求和该向量的2个连续元素的值的函数。因此,输出将必定具有长度“ test1 -1”。
我在互联网上查找并发现大多数情况下带有循环的建议。我对R还是很陌生,但仍然没有真正了解循环的语法,而且,我想拥有一个函数,因为最后我真正想做的就是使用purrr包将此函数应用于更大的数据集。所以我真的只是在寻找这个简单函数的代码,以便以后可以在我的大型数据集中使用它。另外,我对“滚动窗口函数”有一些看法,这似乎很有希望,但是再次,我对R还是陌生的,我想保持简单。 “求和”功能不是我想要的,因为我对2个连续元素之间的总和感兴趣,而不是对所有元素的累加总和感兴趣。
我现在遇到的最大问题是,我不知道如何告诉R我实际上要求和的是连续位置而不是2个值(不太确定你是否明白我的意思)。我尝试了
之类的东西sum_fun1 <- function(x) {
[x] + [x+1]
}
但是在这种情况下,他没有得到x真正是指一个位置,而不是该位置/元素的内容。
非常感谢<3
答案 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