计算多年的平均日期

时间:2015-11-09 19:34:58

标签: r dplyr lubridate

我正在尝试计算每个因素水平的独立年份的平均日期。

DF <- data.frame(Date = seq(as.Date("2013-2-15"), by = "day", length.out = 730))
DF$ID = rep(c("AAA", "BBB", "CCC"), length.out = 730)
head(DF)

        Date  ID
1 2013-02-15 AAA
2 2013-02-16 BBB
3 2013-02-17 CCC
4 2013-02-18 AAA
5 2013-02-19 BBB
6 2013-02-20 CCC

根据上面的数据和下面的代码,我可以计算每个因素的平均日期,但这包括年份。

我想要多年的平均月份和日期。优选的结果是格式为月 - 日的POSIXct时间类(例如12月31日的12-31),表示多年的平均月和日。

library(dplyr)
DF2 <- DF %>% group_by(ID) %>% mutate(
    Col = mean(Date, na.rm = T))
DF2

加成 我正在寻找一年中的平均日,其中包含每个因子级别的月和日组件。例如,如果日期代表动物复制的日期,我对年份之间的年度差异不感兴趣,而是想要一个平均日。

I最终结果看起来像DF2但是使用前面描述的新值计算(一年中平均值为一天的组件。

对不起,这不是更清楚。

2 个答案:

答案 0 :(得分:3)

如果我正确理解您的问题,请点击此处了解如何获取平均日期列。我首先使用yday中的POSIXlt提取一年中的某一天。然后我计算mean。要获取日期,我必须将这些日期添加到实际年份,因此创建Year对象。根据要求,我在结果中将结果与DF2的格式相同。

library(dplyr)
DF2 <- DF %>%
mutate(Year=format(Date,"%Y"),
Date_day=as.POSIXlt(Date, origin = "1960-01-01")$yday)%>%
group_by(ID) %>%
mutate(Col = mean(Date_day, na.rm = T),Mean_date=format(as.Date(paste0(Year,"-01-01"))+Col,"%m-%d"))%>%
select(Date,ID,Mean_date)
DF2
> DF2
Source: local data frame [730 x 3]
Groups: ID [3]

         Date    ID Mean_date
       (date) (chr)     (chr)
1  2013-02-15   AAA     07-02
2  2013-02-16   BBB     07-02
3  2013-02-17   CCC     07-01
4  2013-02-18   AAA     07-02
5  2013-02-19   BBB     07-02
6  2013-02-20   CCC     07-01
7  2013-02-21   AAA     07-02
8  2013-02-22   BBB     07-02
9  2013-02-23   CCC     07-01
10 2013-02-24   AAA     07-02
..        ...   ...       ...

答案 1 :(得分:0)

您可以使用均值函数获取日期的均值。但是,请注意,根据数据类型,平均实现(和结果)将有所不同。对于POSIXct,将计算平均值并返回日期和时间-考虑采用一堆整数的平均值,您可能会得到浮点数或数字。对于日期,它实际上会将日期“舍入”到最接近的日期。

例如,我最近对日期进行了平​​均。查看使用不同数据类型时的输出。

> mean(as.Date(stationPointDf$knockInDate))
[1] "2018-06-04"
> mean(as.POSIXct(stationPointDf$knockInDate))
[1] "2018-06-03 21:19:21 CDT"

如果我要查找跨年的平均月和日,则可以使用lubridate软件包将所有日期转换为具有当年的年份。

library(lubridate)
year(myVectorOfDates) <- 2018

然后,我计算平均值并减去年份。