使用 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
函数 yday
和 year
然后将 paste
yday
和 year
一起使用,但似乎有可能是一个更优雅的解决方案。
您可以使用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
.
我正在尝试按一年中的某一天计算观察次数。以下是六个观察结果:
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
函数 yday
和 year
然后将 paste
yday
和 year
一起使用,但似乎有可能是一个更优雅的解决方案。
您可以使用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
.