gpt4 book ai didi

r - 根据日期移动总和

转载 作者:行者123 更新时间:2023-12-01 05:21:34 25 4
gpt4 key购买 nike

我是一个大型数据集,我想计算一列的移动年度总和。它必须是一个确切的年份,所以我不能使用 rollapply 作为它基于特定天数而不是实际日期。

例如,我有以下代码:

dates = seq.Date(as.Date('2006-01-01'),as.Date('2007-12-31'),by='days')
num = 1:length(dates)
y = cbind(ld,num)

ld num
[1,] 13149 1
[2,] 13150 2
[3,] 13151 3
[4,] 13152 4
[5,] 13153 5
[6,] 13154 6

我想要一个滚动的一年历史列号总和。

我设法解决它的唯一方法是使用循环和数据框的子集。这不是很有效,我希望有人可以建议我如何使用 embed 函数来计算闰年,因为它要快得多。

使用 embed 函数,我有以下代码,只要它不是闰年就可以工作。
b = embed(y[,2],366)
sums = colSums(b)

a = ld[length(dates)-365:length(dates)]
final = cbind(dates = a, rollsum = rev(sums))


head(final)
dates rollsum
[1,] 13513 66795
[2,] 13514 67160
[3,] 13515 67525
[4,] 13516 67890
[5,] 13517 68255
[6,] 13518 68620

有没有人有更有效的方法来计算基于特定日期而不是天数的移动总和?

最佳答案

您可以在数据中添加一列,日期为一年前
(考虑闰年),并使用 sqldf计算滚动总和。

# Sample data
dates <- seq.Date(as.Date('2006-01-01'),as.Date('2007-12-31'),by='days')
d <- data.frame( date = dates, value = rnorm(length(dates)) )
#d <- d[ sample(length(dates), length(dates)/2), ] # For more irregular data
d <- d[ order(d$date), ]

# Compute the date one year ago (you can also use lubridate, for date arithmetic)
d$previous_year <- sapply(
d$date,
function(u) as.character(seq(u, length=2, by="-1 years")[2])
)
d$date <- as.character(d$date)

# Compute the rolling sum
library(sqldf)
sqldf( "
SELECT A.date AS date,
SUM( B.value ) AS sum,
MIN( B.date ) AS start,
MAX( B.date ) AS end,
COUNT(*) AS observations
FROM d A, d B
WHERE A.previous_year < B.date AND B.date <= A.date
GROUP BY A.date
" )

关于r - 根据日期移动总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16250902/

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