我想知道如果有一种方法,以每天平均数据为每周数据。 我叫CADaily数据框看起来是这样的:
> CADaily[1:10, ]
Climate_Division Date Rain
885 1 1948-07-01 0.8750000
892 1 1948-07-02 2.9166667
894 1 1948-07-03 0.7916667
895 1 1948-07-04 0.4305556
898 1 1948-07-05 0.8262061
901 1 1948-07-06 0.5972222
904 1 1948-07-17 0.04166667
905 1 1948-07-18 0.08333333
907 1 1948-07-20 0.04166667
909 1 1948-07-22 0.12500000
910 1 1948-07-21 NA
我的目标是类似于聚合函数找到的日常雨水的平均插入日期(当然)和Climate_Division(范围为1〜7)周雨值的基础。 我在网上搜索,我对面,我是能够使用,但不太标准杆,以我的目标代码来了:
apply.weekly(xts(CADaily[,-2], order.by= CADaily[,2]), FUN = mean)
这做什么,我想它做的事,但我的专栏Climate_Division也平均。 我只是想只和秩序这基础上,Climate_Division其次日期以平均雨。 有没有一种方法,我都不可能做到这一点,如下所示:
aggregate(CADaily, by =list(CADaily$Climate_Division, CADaily$Date), FUN = mean, na.rm = TRUE)
其中,日期是某种形式的周? 或者有另一种方式?
编辑:
亲爱的大家,
谢谢您的帮助。 也许使用聚合不走关于这个问题,我本来以为最好的办法。 在输出方面,我想获得这些年来的数据(1948年至1995年)的周平均的降雨。 换句话说,我希望得到一个很好的形式,我可以输入到具有的一周结束之日起的形式的时间序列。 我正在寻找(请记住,有可能存在的NA值)为输出:
Climate_Division Date Rain
1 1948-07-03 1.527778
1 1948-07-10 0.6179946
1 1948-07-17 0.04166667
1 1948-07-24 0.08333333
...
1 1995-12-23 0.24513245
1 1995-12-30 0.12450545
或者是有表达是由代表日期的每周数据的更好的办法?
谢谢您的帮助。
更新答案
基于在OP对请求更新,我修改了代码在规定每周日(周六)一天的日期汇总数据。 这一次我只用在基地R.可用的功能它忽略NAS(如果只有NAS进行给定End_of_Week-Climate_Division你NaN的,不是一个数字)。
# Data with another Climate division as example (same daily values and dates)
CADaily <-
structure(list(Climate_Division = c(1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2), Date = structure(c(1L, 2L,
3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 1L, 2L, 3L, 4L, 5L, 6L, 7L,
8L, 9L, 10L), .Label = c("01/07/1948", "02/07/1948", "03/07/1948",
"04/07/1948", "05/07/1948", "06/07/1948", "17/07/1948", "18/07/1948",
"20/07/1948", "22/07/1948"), class = "factor"), Rain = c(0.875,
2.9166667, 0.7916667, 0.4305556, 0.8262061, 0.5972222, 0.04166667,
0.08333333, 0.04166667, 0.125, 0.875, 2.9166667, 0.7916667, 0.4305556,
0.8262061, 0.5972222, 0.04166667, 0.08333333, 0.04166667, 0.125
), week = c(27, 27, 27, 27, 27, 27, 29, 29, 29, 30, 27, 27, 27,
27, 27, 27, 29, 29, 29, 30)), .Names = c("Climate_Division",
"Date", "Rain", "week"), row.names = c(NA, 20L), class = "data.frame")
# Coerce to Date class
CADaily$Date <- as.Date(x=CADaily$Date, format='%d/%m/%Y')
# Extract day of the week (Saturday = 6)
CADaily$Week_Day <- as.numeric(format(CADaily$Date, format='%w'))
# Adjust end-of-week date (first saturday from the original Date)
CADaily$End_of_Week <- CADaily$Date + (6 - CADaily$Week_Day)
# Aggregate over week and climate division
aggregate(Rain~End_of_Week+Climate_Division, FUN=mean, data=CADaily, na.rm=TRUE)
# Output
# End_of_Week Climate_Division Rain
# 1 1948-07-03 1 1.52777780
# 2 1948-07-10 1 0.61799463
# 3 1948-07-17 1 0.04166667
# 4 1948-07-24 1 0.08333333
# 5 1948-07-03 2 1.52777780
# 6 1948-07-10 2 0.61799463
# 7 1948-07-17 2 0.04166667
# 8 1948-07-24 2 0.08333333
附加操作
此外,使用这个代码可以获取从附加聚合函数的结果,假定结果是每个星期分对同一长度的原子矢量。
# Aggregate over week and climate division, and show the total number of
# observations per week, the number of observations which represent missing
# values, the average, and the standard deviation.
aggregate(Rain~End_of_Week+Climate_Division, data=CADaily,
FUN=function(x) c(n=length(x),
NAs=sum(is.na(x)),
Average=mean(x, na.rm=TRUE),
SD=sd(x, na.rm=TRUE)))
# Output. You get NA for the standard deviation if there is only one observation.
# End_of_Week Climate_Division Rain.n Rain.NAs Rain.Average Rain.SD
# 1 1948-07-03 1 3.00000000 0.00000000 1.52777780 1.20353454
# 2 1948-07-10 1 3.00000000 0.00000000 0.61799463 0.19864151
# 3 1948-07-17 1 1.00000000 0.00000000 0.04166667 NA
# 4 1948-07-24 1 3.00000000 0.00000000 0.08333333 0.04166667
# 5 1948-07-03 2 3.00000000 0.00000000 1.52777780 1.20353454
# 6 1948-07-10 2 3.00000000 0.00000000 0.61799463 0.19864151
# 7 1948-07-17 2 1.00000000 0.00000000 0.04166667 NA
# 8 1948-07-24 2 3.00000000 0.00000000 0.08333333 0.04166667
原来的答案
尝试用lubridate
包。 加载它,然后汇总(保持备案为原来的答案,这反映了OP的要求按周聚集的一部分)。
# Load lubridate package
library(package=lubridate)
# Set Weeks number. Date already of class `Date`
CADaily$Week <- week(CADaily$Date)
# Aggregate over week number and climate division
aggregate(Rain~Week+Climate_Division, FUN=mean, data=CADaily, na.rm=TRUE)
# Output
# Week Climate_Division Rain
# 1 27 1 1.07288622
# 2 29 1 0.05555556
# 3 30 1 0.12500000
# 4 27 2 1.07288622
# 5 29 2 0.05555556
# 6 30 2 0.12500000
xts
是伟大的这样的操作。 使用endpoints
到子集数据,然后sapply
每周对待它。
CADaily <- read.table(text =' Climate_Division Date Rain
885 1 1948-07-01 0.8750000
892 1 1948-07-02 2.9166667
894 1 1948-07-03 0.7916667
895 1 1948-07-04 0.4305556
898 1 1948-07-05 0.8262061
901 1 1948-07-06 0.5972222
904 1 1948-07-17 0.04166667
905 1 1948-07-18 0.08333333
907 1 1948-07-20 0.04166667
909 1 1948-07-22 0.12500000',head=T)
dat.xts <- xts(CADaily[,-2], order.by= as.POSIXct(CADaily[,2]))
INDEX <- endpoints(dat.xts, 'weeks')
lapply(1:(length(INDEX) - 1), function(y) {
y <- dat.xts[(INDEX[y] + 1):INDEX[y + 1]]
data.frame(y$Climate_Division,mean(y$Rain))
})
我的结果是本周的列表:
[[1]]
Climate_Division mean.y.Rain.
1948-07-01 1 1.168019
1948-07-02 1 1.168019
1948-07-03 1 1.168019
1948-07-04 1 1.168019
1948-07-05 1 1.168019
[[2]]
Climate_Division mean.y.Rain.
1948-07-06 1 0.5972222
[[3]]
Climate_Division mean.y.Rain.
1948-07-17 1 0.0625
1948-07-18 1 0.0625
[[4]]
Climate_Division mean.y.Rain.
1948-07-20 1 0.08333334
1948-07-22 1 0.08333334
我从我以前的答案原路返回。 我认为这是一个简单得多。
你只需要找到什么是未来的周末时间对于每一行,然后汇总
CADaily <- read.table(text = "Climate_Division Date Rain\n1 1948-07-01 0.8750000\n1 1948-07-02 2.9166667\n1 1948-07-03 0.7916667\n1 1948-07-04 0.4305556\n1 1948-07-05 0.8262061\n1 1948-07-06 0.5972222\n1 1948-07-17 0.04166667\n1 1948-07-18 0.08333333\n1 1948-07-20 0.04166667\n1 1948-07-22 0.12500000\n2 1948-07-01 0.8750000\n2 1948-07-02 2.9166667\n2 1948-07-03 0.7916667\n2 1948-07-04 0.4305556\n2 1948-07-05 0.8262061\n2 1948-07-06 0.5972222\n2 1948-07-17 0.04166667\n2 1948-07-18 0.08333333\n2 1948-07-20 0.04166667\n2 1948-07-22 0.12500000",
head = T)
CADaily$weekend <- as.POSIXlt(CADaily$Date) + (7 - as.POSIXlt(CADaily$Date)$wday) * 24 * 60 * 60
aggregate(Rain ~ weekend + Climate_Division, data = CADaily, FUN = mean)
## weekend Climate_Division Rain
## 1 1948-07-04 1 1.52777780
## 2 1948-07-11 1 0.61799463
## 3 1948-07-18 1 0.04166667
## 4 1948-07-25 1 0.08333333
## 5 1948-07-04 2 1.52777780
## 6 1948-07-11 2 0.61799463
## 7 1948-07-18 2 0.04166667
## 8 1948-07-25 2 0.08333333