使用 R 中的 lubridate 按一年中的某一天计算观测值

Count observations by day of year using lubridate in R

我正在尝试按一年中的某一天计算观察次数。以下是六个观察结果:

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 returns [=] 之间的整数14=] 和 365

有没有办法按一年中的某一天分组?一种解决方案是使用 lubridate 函数 ydayyear 然后将 paste ydayyear 一起使用,但似乎有可能是一个更优雅的解决方案。

您可以使用date函数或使用round_date(Date, units = "day")或者,您可以将其转换为 Date 以删除时间戳:as.Date(Date)(编辑:不推荐)。第三种选择是对 ymd_hms 函数使用 truncated 参数。

我从评论中了解到,您希望按日期汇总数据。

如果您想按日期对 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))

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

#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())

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 列是字符)到日期 class,主要等同于 as.Date.