R dplyr滚动总和
R dplyr rolling sum
我正在通过 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
library(dplyr)
dg %>%
arrange(site,year,animal) %>%
group_by(site,animal) %>%
mutate(rollsum=cumsum(count))
如果样本大小 (n
) 小于 window 大小 (k
),您可以改用 RcppRoll::roll_sum
,其中 returns 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
来自 RcppRoll 的 roll_Sum 将 return 一个 NA 代替错误,只要数据点的数量小于 window 大小。
但是,如果您想要 return 当前数据点数量的总和 - 即使小于 window 大小,您可以使用 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 将 return 原始值或当前数据点的总和,即使它小于 window 大小而不是 returning 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 实现滚动总和计算,但在我的数据库中,我有许多变量只有一个或只有几个观察值,导致(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
library(dplyr)
dg %>%
arrange(site,year,animal) %>%
group_by(site,animal) %>%
mutate(rollsum=cumsum(count))
如果样本大小 (n
) 小于 window 大小 (k
),您可以改用 RcppRoll::roll_sum
,其中 returns 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
roll_Sum 将 return 一个 NA 代替错误,只要数据点的数量小于 window 大小。
但是,如果您想要 return 当前数据点数量的总和 - 即使小于 window 大小,您可以使用 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 将 return 原始值或当前数据点的总和,即使它小于 window 大小而不是 returning 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