我试图计算一年中的观察数量。以下是六个观察结果:
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
函数lubridate
和yday
,然后同时使用year
paste
和yday
,但似乎可能是一个更优雅的解决方案。
答案 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))