R 滚动和

R 滚动和,r,dplyr,R,Dplyr,我正在通过dplyr实现一个滚动和计算,但在我的数据库中,我有许多变量只有一个或只有几个观察值,导致(k小于n)错误。在这个J示例中,我尝试使用filter和merge来解决这个问题,但不知道是否有一种方法可以在dplyr中更优雅、更自动地实现这一点。请参见下面的示例 #create data dg = expand.grid(site = c("Boston","New York"), year = 2000:2004) dg$

我正在通过dplyr实现一个滚动和计算,但在我的数据库中,我有许多变量只有一个或只有几个观察值,导致(k小于n)错误。在这个J示例中,我尝试使用filter和merge来解决这个问题,但不知道是否有一种方法可以在dplyr中更优雅、更自动地实现这一点。请参见下面的示例

    #create data
    dg = expand.grid(site = c("Boston","New York"),
                     year = 2000:2004)
    dg$animal="dog"
    dg$animal[10]="cat";dg$animal=as.factor(dg$animal)
    dg$count = rpois(dim(dg)[1], 5) 

如果我运行下面的代码,因为我只有一行带有“cat”,因此会得到(错误:k您可以改为使用
RcppRoll::roll\u sum
,如果样本大小(
n
)小于窗口大小(
k
),则返回NA)


如果数据点数小于窗口大小,则RcppRoll的roll_Sum将返回NA而不是错误

但是,如果要返回当前数据点数量的总和,即使小于窗口大小,也可以使用zoo中的rollapplyr函数

library(zoo)
library(dplyr)

   dg %>%
         arrange(site,year,animal) %>%
         group_by(site, animal) %>%
         mutate(roll_sum = roll_sum(count, 2, align = "right", fill = NA)) %>%
         mutate(rollapply_sum =rollapplyr(count, 2, sum, partial = TRUE) )
Rollapply_sum将返回原始值或当前数据点的总和,即使其小于窗口大小而不是返回NA

       site  year animal count roll_sum rollapply_sum
     (fctr) (int) (fctr) (int)    (dbl)         (int)
1    Boston  2000    dog     4       NA             4
2    Boston  2001    dog     5        9             9
3    Boston  2002    dog     3        8             8
4    Boston  2003    dog     9       12            12
5    Boston  2004    dog     6       15            15
6  New York  2000    dog     4       NA             4
7  New York  2001    dog     8       12            12
8  New York  2002    dog     8       16            16
9  New York  2003    dog     6       14            14
10 New York  2004    cat     2       NA             2

这并不提供问题的答案,因为特定问题询问dplyr解决方案,以下是dplyr网页(dplyr.tidyverse.org/articles/window functions.html)关于滚动函数的说明:“滚动聚合在固定宽度的窗口中运行。在base R或dplyr中找不到它们,但在其他软件包中有许多实现,如RcppRoll。”目前还没有dplyr函数,他们推荐Khashaa的解决方案。
 library(dplyr)
 dg %>% 
   arrange(site,year,animal) %>% 
   group_by(site,animal) %>% 
   mutate(rollsum=cumsum(count))
set.seed(1)
dg$count = rpois(dim(dg)[1], 5) 
library(RcppRoll)
library(dplyr)
dg %>%
     arrange(site,year,animal) %>%
     group_by(site, animal) %>%
     mutate(roll_sum = roll_sum(count, 2, align = "right", fill = NA))    
#       site year animal count roll_sum
#1    Boston 2000    dog     4       NA
#2    Boston 2001    dog     5        9
#3    Boston 2002    dog     3        8
#4    Boston 2003    dog     9       12
#5    Boston 2004    dog     6       15
#6  New York 2000    dog     4       NA
#7  New York 2001    dog     8       12
#8  New York 2002    dog     8       16
#9  New York 2003    dog     6       14
#10 New York 2004    cat     2       NA
library(zoo)
library(dplyr)

   dg %>%
         arrange(site,year,animal) %>%
         group_by(site, animal) %>%
         mutate(roll_sum = roll_sum(count, 2, align = "right", fill = NA)) %>%
         mutate(rollapply_sum =rollapplyr(count, 2, sum, partial = TRUE) )
       site  year animal count roll_sum rollapply_sum
     (fctr) (int) (fctr) (int)    (dbl)         (int)
1    Boston  2000    dog     4       NA             4
2    Boston  2001    dog     5        9             9
3    Boston  2002    dog     3        8             8
4    Boston  2003    dog     9       12            12
5    Boston  2004    dog     6       15            15
6  New York  2000    dog     4       NA             4
7  New York  2001    dog     8       12            12
8  New York  2002    dog     8       16            16
9  New York  2003    dog     6       14            14
10 New York  2004    cat     2       NA             2