R语言 如何在不返回NA的情况下获得滚动和

ycl3bljg  于 11个月前  发布在  其他
关注(0)|答案(3)|浏览(87)

我试图得到过去N天的滚动和,不包括NA的。使用这个示例df:
myVec <- data.frame(myVec = c(7,2,4,5,1,3,2,9))
我知道函数rollsumr使用这种方法:

library(zoo)
rollsumr(myVec$myVec, k = 3, fill = NA)

字符串
这会产生以下输出:NA NA 13 11 10 9 6 14然而,我不想让领先的NA占据这些点。我希望第一个点是第一个索引,第二个点是1st + 2nd,依此类推,直到达到Nth点,最终结果看起来像7 9 13 11 10 9 6 14
如果N的天数很短,我可以使用for循环来遍历,但是如果N的滚动和是50,有100行,我必须为前50天的每一天单独索引。所以,我认为有一种更简单,更有效的方法来实现这一点。

x7yiwoj4

x7yiwoj41#

slider::slide_dbl就是你要找的

slider::slide_dbl(myVec$myVec, sum,.before = 2, .after = 0)
[1]  7  9 13 11 10  9  6 14

字符串

sqyvllje

sqyvllje2#

下面是一个有效的向量化方法:

> v=c(7,2,4,5,1,3,2,9)
> o=outer(1:length(v),-2:0,"+")
> rowSums(matrix(v[ifelse(o<1|o>length(v),NA,o)],length(v)),na.rm=T)
[1]  7  9 13 11 10  9  6 14

字符串
基准:

v=sample(1:1e5)

msum=\(x,y){
  o=outer(1:length(x),y,"+")
  rowSums(matrix(x[ifelse(o<1|o>length(x),NA,o)],length(x)),na.rm=T)
}

nonvectorized=\(x,y){
  l=length(x)
  sapply(1:l,\(i)sum(x[max(1,i-y):i],na.rm=T))
}

microbenchmark::microbenchmark(times=10,
  vectorized=msum(v,-2:0),
  nonvectorized=nonvectorized(v,2),
  rollapplyr=zoo::rollapplyr(v,3,sum,partial=T),
  slide_dbl=slider::slide_dbl(v,sum,.before=2,.after=0)
)
Unit: milliseconds
          expr       min        lq      mean    median        uq       max neval
    vectorized  12.66232  17.63446  17.74140  17.86735  18.41807  25.08393    10
 nonvectorized 154.50835 163.04709 180.35591 172.72742 183.88661 252.43063    10
    rollapplyr 737.47610 789.48767 819.80156 797.42164 820.30966 973.17992    10
     slide_dbl  53.21695  55.42821  61.68474  58.34419  62.53458  83.75196    10
relj7zay

relj7zay3#

您可以在rollapplyr中使用partial=TRUE

library(zoo)

rollapplyr(myVec$myVec, 3, sum, partial = TRUE)

# [1]  7  9 13 11 10  9  6 14

字符串
或者在dplyr中使用相同的函数:

library(dplyr)

myVec %>%
  mutate(myVec = rollapplyr(myVec, 3, sum, partial = TRUE))

相关问题