gpt4 book ai didi

r - 是否有像 rollapplyr 这样的快速 R 函数随着窗口大小的增加?

转载 作者:行者123 更新时间:2023-12-01 23:37:07 24 4
gpt4 key购买 nike

我想通过滑动窗口对分组数据计算总和。

因为我想尽可能坚持官方功能,所以我开始使用 rollapplyr 是这样的:

library(tidyverse)
library(reshape2)
library(zoo)

data = data.frame(Count=seq(1,10,1),
group=c("A","B","A","A","B","B","B","B","A","A"))


window_size <- 3

data_rolling <- data %>%
arrange(group) %>%
group_by(group) %>%
mutate(Rolling_Count = rollapplyr(Count, width=window_size, FUN=sum, fill = NA)) %>%
ungroup()

对于小于宽度的第一个条目(在本例中为 3),它会按照定义填充 NA,但实际上我希望像这样获得可能数据的总和:

 Count group Rolling_Count expected_Result
1 A NA 1
3 A NA 4
4 A 8 8
9 A 16 16
10 A 23 23
2 B NA 2
5 B NA 7
6 B 13 13
7 B 18 18
8 B 21 21

我知道我可以用这样的东西替换 width=window_size:

c(rep(1:window_size,1),rep(window_size:window_size,(n()-window_size)))

得到我想要的,但这真的很慢。此外,这种方法会假设 n() 大于 window_size。

那么:是否已经有一个 R/zoo 函数可以像上面那样处理分组数据以及条目小于 window_size 的数据,并且比上述方法更快?

感谢任何提示!

最佳答案

一个基于 data.tableRcppRoll 的解决方案,性能应该更高。

它不像我想要的那么干净——实际上在 RcppRoll::roll_sum() 中有一个 partial 参数尚未实现,理论上可以解决这很干净,但似乎不会很快奏效 -- 参见 GH Issue #18 .

无论如何,直到有人在 R 中实现滚动总和以允许您在这里需要的东西,在第一个 n - 1 行上添加一个 cumsum 似乎是一个明智的解决方案。

library(data.table)
library(RcppRoll)

data = data.frame(Count=seq(1,10,1),
group=c("A","B","A","A","B","B","B","B","A","A"))

## Convert to a `data.table` by reference
setDT(data)
window_size <- 3

## Add a counter row so that we can go back and fill in rows
## 1 & 2 of each group
data[,Group_RowNumber := seq_len(.N), keyby = .(group)]

## Do a rolling window -- this won't fill in the first 2 rows
data[,Rolling_Count := RcppRoll::roll_sum(Count,
n = window_size,
align = "right",
fill = NA), keyby = .(group)]

## Go back and fill in the ones we missed
data[Group_RowNumber < window_size, Rolling_Count := cumsum(Count), by = .(group)]

data

# Count group Group_RowNumber Rolling_Count
# 1: 1 A 1 1
# 2: 3 A 2 4
# 3: 4 A 3 8
# 4: 9 A 4 16
# 5: 10 A 5 23
# 6: 2 B 1 2
# 7: 5 B 2 7
# 8: 6 B 3 13
# 9: 7 B 4 18
# 10: 8 B 5 21

关于r - 是否有像 rollapplyr 这样的快速 R 函数随着窗口大小的增加?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54430792/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com