【问题标题】:Function calculating 9 sums (of 'consecutive elements') of a vector with 10 elements计算具有 10 个元素的向量的 9 个总和(“连续元素”)的函数
【发布时间】:2019-07-12 13:54:22
【问题描述】:

假设我有一个向量

 test1 <- 1:10 

我想编写一个函数,将这个向量的 2 个连续元素的值相加。因此,输出的长度必须为“test1 -1”。

我在 Internet 上查找,发现大多数情况下都是带有循环的建议。我对 R 很陌生,仍然没有真正了解循环的语法,此外,我想要一个函数,因为我最后真正想做的是使用 purrr 包将此函数应用于更大的数据集.所以我真的只是在寻找这个简单函数的代码,以便以后可以将它用于我的大数据集。另外,我对“滚动窗口函数”进行了一些修改,这似乎很有希望,但同样,我对 R 很陌生,我想保持简单。 “cumsum”函数不是我想要的,因为我对 2 个连续元素之间的总和而不是所有元素的累积总和感兴趣。

我现在遇到的最大问题是我不知道如何告诉 R 我真正想要总结的是连续位置而不是 2 个值(不太确定你是否明白我的意思)。我试过像

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

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

非常感谢

【问题讨论】:

  • @HighPerformanceMark 嗯,我不太确定。我正在寻找一个对向量中超过 2 个连续元素求和的函数。 [diff] 计算差异,而且我想创建自己的函数,因为我稍后会使用 [purrr] 应用它,所以我很确定一旦我在那里我需要更改函数内部的一些小东西.
  • @Fabio 试试rollapply 函数

标签: r sum


【解决方案1】:

您可以使用 zoo 包中的 rollapply 函数:

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

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

【讨论】:

  • 是的,这就是我要找的!非常感谢!
【解决方案2】:

这是一种基于 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

【讨论】:

    猜你喜欢
    • 2017-11-13
    • 1970-01-01
    • 1970-01-01
    • 2019-06-02
    • 1970-01-01
    • 2015-07-26
    • 2010-12-27
    • 2014-01-06
    相关资源
    最近更新 更多