R dplyr 滚动总和

标签 r dplyr

我正在通过 dplyr 实现滚动总和计算,但在我的数据库中,我有许多变量只有一个或只有几个观察值,导致(k 小于 n)错误。我试图在 thisj 示例中使用过滤器和合并来解决这个问题,但想知道是否有一种方法可以在 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 <= n 不正确)错误
#running average
dg2 = dg %>%
  arrange(site,year,animal) %>%
  group_by(site,animal) %>%
#   filter(animal=="dog") %>%
  mutate(roll_sum = rollsum(x = count, 2, align = "right", fill = NA))

我试图通过使用以下代码来解决这个问题,该代码过滤掉了“cat”值并进行了后续合并,但我想知道是否可以直接在 dplyr 中执行此操作,尤其是在此解决方案中,必须指定/提前知道每个变量的唯一行数,如果要更改滚动总和的范围等,则手动调整。
dg2 = dg %>%
  arrange(site,year,animal) %>%
  group_by(site,animal) %>%
  filter(animal=="dog") %>%
  mutate(roll_sum = rollsum(x = count, 2, align = "right", fill = NA))

merge(dg,dg2,c("site", "year","animal","count"),all.x=TRUE)

       site year animal count roll_sum
1    Boston 2000    dog     5       NA
2    Boston 2001    dog     6       11
3    Boston 2002    dog     6       12
4    Boston 2003    dog     5       11
5    Boston 2004    dog     3        8
6  New York 2000    dog     8       NA
7  New York 2001    dog     3       11
8  New York 2002    dog    12       15
9  New York 2003    dog     3       15
10 New York 2004    cat     3       NA

非常感谢-W

最佳答案

您可以改为使用 RcppRoll::roll_sum如果样本大小( n )小于窗口大小( k ),则返回 NA 。

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

关于R dplyr 滚动总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30153835/

相关文章:

r - 如何滚动应用多列数据表

r - R 中 group 的每个变化增加 1

r - 如何为R中的每个不同列选择不同行中的值?

r - 如何使用 DPLYR 汇总一列中组的唯一值?

r - 在R中的变量中分离数据

R 重新定义 base::mean() 函数以包含 is.finite() 功能

r - Shiny :单击图像时更改选项卡

r - tidyr:将一列分成可变数量的列

r - 如何将参数传递给函数内的 dplyr 连接函数?

r - 对于每一行,查找条件下的值