使用R中的lubridate计算每年的观察值

时间:2016-09-08 03:07:11

标签: r date lubridate

我试图计算一年中的观察数量。以下是六个观察结果:

six_obs <- data.frame(Date = c("2015-09-06 00:00:12 UTC", "2015-09-06 00:01:47 UTC", "2015-09-06 00:03:30 UTC", "2015-10-06 00:03:31 UTC", "2015-10-06 00:03:36 UTC", "2015-10-06 00:06:18 UTC"), Count = c(6, 4, 5, 4, 5, 7), stringsAsFactors = F)

为了按年份分组,我可以执行以下操作:

library(dplyr)
library(lubridate)

six_obs %>%
    mutate(Date = ymd_hms(Date),
           day_of_year = yday(Date)) %>%
    group_by(day_of_year) %>%
    summarize(number_of_obs = n())

这很好用,但是如果我有多年的日期很多,那么这将不会直接起作用,因为lubridate函数yday返回1和{{之间的整数1}}。

有没有办法在一年中分组?一种解决方案是使用365函数lubridateyday,然后同时使用year pasteyday,但似乎可能是一个更优雅的解决方案。

4 个答案:

答案 0 :(得分:3)

您可以使用date功能或使用round_date(Date, units = "day")或者你可以将它转换为Date来摆脱时间戳:as.Date(Date) (编辑:不推荐)。第三种选择是使用truncated函数的ymd_hms参数。

答案 1 :(得分:2)

另一种选择是创建一系列日期,然后使用cut命令对结果进行分组和汇总。无需使用润滑剂 使用创建的数据查看此示例:

#generate sample data
Date<-seq(from= as.POSIXct("2016-06-01"), by="1 min", length.out = 9000)
value<-rnorm(9000, 50)
df<-data.frame(Date, value)


#group the results by 1 day intervals
library(dplyr)
out<-summarize(group_by(df, cut(df$Date, breaks="1 day") ), n())

答案 2 :(得分:2)

awk '/<.*>/&&!/<XXX>/' 相当于dplyr::count,所以你真的只需要

group_by(...) %>% summarise(n = n())

其中six_obs %>% count(day_of_year = date(Date)) ## # A tibble: 2 × 2 ## day_of_year n ## <date> <int> ## 1 2015-09-06 3 ## 2 2015-10-06 3 只是转换(或解析,如果lubridate::date列是字符)到Date类,大部分等同于Date

答案 3 :(得分:1)

我对评论的理解是,您希望按日期汇总数据。

如果您想按日期将Count中的计数相加,那么我们可以这样做:

aggregate(six_obs$Count, by=list(as.Date(six_obs$Date)),sum)
     Group.1  x
1 2015-09-06 15
2 2015-10-06 16

或使用date()中的lubridate

aggregate(six_obs$Count, by=list(date(as.character(six_obs$Date))),sum)

如果您只想在Date字段中总结日期的出现次数,忽略Count,那么就这样做:

table(as.Date(six_obs$Date))
2015-09-06 2015-10-06 
         3          3

table(date(six_obs$Date))