我有一个包含30年日常数据的时间序列(两列标有日期和值)
Date Value
01-01-1975 0.051
02-01-1975 0.051
03-01-1975 0.051
04-01-1975 0.051
05-01-1975 0.051
06-01-1975 0.051
07-01-1975 0.051
08-01-1975 0.051
09-01-1975 0.051
10-01-1975 0.048
11-01-1975 0.048
12-01-1975 0.048
.........
我试图将5天的总数合计为总和(因此,每年我会得到73个值,这是闰年,那么它的最后值将是6天而不是5天)换句话说我总是我希望从1月1日开始,每年12月31日结束,但我需要以某种方式处理闰年案例,例如通过单独处理每年或通过查找闰年并以不同方式对待它们。但我遇到了问题
我做了以下,
test <- read.csv("~/H/x.csv")
test$Date <- as.Date(test$Date, format = "%d-%m-%Y")
output <- aggregate(Flow ~ cut(Date, "5 days"), test, sum)
但它并没有给我我想要的结果,这是每年我想要计算73个值...
这是我第一次参加编程和R,所以非常欢迎您的指导
答案 0 :(得分:0)
要播放的一些示例数据:
test = data.frame(Date=seq(as.Date("1975-01-01"),as.Date("2005-01-01"),1))
test$value = runif(nrow(test))
head(test)
Date value
1 1975-01-01 0.2929824
2 1975-01-02 0.2222665
3 1975-01-03 0.2659065
4 1975-01-04 0.5511573
现在使用lubridate
包的yday
函数将年中的日期设置为1到366:
> require(lubridate)
> test$yday = yday(test$Date)
现在整数除以年份减去1乘以5来给出我们的分组(在这种情况下从0到73):
> test$grp = (test$yday-1) %/% 5
head(test,10)
Date value yday grp
1 1975-01-01 0.29298243 0 0
2 1975-01-02 0.22226646 1 0
3 1975-01-03 0.26590648 2 0
4 1975-01-04 0.55115730 3 0
5 1975-01-05 0.55990854 4 0
6 1975-01-06 0.70054357 5 1
7 1975-01-07 0.27184097 6 1
8 1975-01-08 0.47779337 7 1
9 1975-01-09 0.09127241 8 1
10 1975-01-10 0.65023465 9 1
所以我们每年都有73组的奇怪日子。哪些?
test[test$grp==73,]
Date value yday grp
731 1976-12-31 0.6636329 365 73
2192 1980-12-31 0.4586537 365 73
3653 1984-12-31 0.3473794 365 73
5114 1988-12-31 0.9160449 365 73
6575 1992-12-31 0.3215585 365 73
8036 1996-12-31 0.1965876 365 73
9497 2000-12-31 0.6795412 365 73
10958 2004-12-31 0.3622685 365 73
我们想把这些放在第72组:
test$grp[test$grp==73]=72
现在我们可以根据该组变量进行分析,我们应该只得到73个值(记住我们从零开始)。我会使用dplyr
,因为它很酷:
require(dplyr)
test %>% group_by(grp) %>% summarise(mean=mean(value))
Source: local data frame [73 x 2]
grp mean
1 0 0.5052336
2 1 0.5178286
3 2 0.4844037
4 3 0.5368534
5 4 0.4900208
6 5 0.5078784
7 6 0.4754043
....
73 x 2看起来正确!
答案 1 :(得分:0)
cut
为5天,但请按年ave
进行,以便数周不跨越年份。这给出了Date5
。现在aggregate
超过了切割值:
# test data
DF <- data.frame(Date = seq(as.Date("1975-01-01"), length = 2000, by = "day"),
Value = 1:2000)
to.yr <- function(x) as.numeric(format(x, "%Y"))
Date5 <- ave(DF$Date, to.yr(DF$Date), FUN = function(x) cut(x, "5 day"))
ag <- aggregate(Value ~ Date5, DF, sum)
计算使用的周数(全部或部分):
> table(to.yr(ag$Date5))
1975 1976 1977 1978 1979 1980
73 74 73 73 73 35