有没有可能';bin';按日期计算的值,以获得ggplot2和R中每2周的总计?

有没有可能';bin';按日期计算的值,以获得ggplot2和R中每2周的总计?,r,ggplot2,R,Ggplot2,我有一个数据帧,它是一个运行历史记录。一些变量包括日期(在POSIXct中)和该运行的值(此处=大小)。我想生成各种图形,显示一条基于特定日期范围大小列的总和的线。理想情况下,我希望使用相同的数据集,并改变每周、2周、每月和季度的总数 下面是一个示例数据集 require(ggplot2) set.seed(666) seq(Sys.time()-(365*24*60*60), Sys.time(), by="day") foo<-data.frame(Date=sample(seq(

我有一个数据帧,它是一个运行历史记录。一些变量包括日期(在POSIXct中)和该运行的值(此处=大小)。我想生成各种图形,显示一条基于特定日期范围大小列的总和的线。理想情况下,我希望使用相同的数据集,并改变每周、2周、每月和季度的总数

下面是一个示例数据集

require(ggplot2)
set.seed(666)

seq(Sys.time()-(365*24*60*60), Sys.time(), by="day")

foo<-data.frame(Date=sample(seq(today-(365*24*60*60), today, by="day"),50, replace=FALSE),
        value=rnorm(50, mean=100, sd=25),
        type=sample(c("Red", "Blue", "Green"), 50, replace=TRUE))
或者我可以这样做,以显示每月的金额

ggplot(data=foo, aes(x=format(Date, "%m %y"), y=value, colour=type))+stat_summary(fun.y=sum, geom="line", aes(group=type))
但是,每季度/2周进行求和会变得更加复杂。理想情况下,我希望将stat_bin和stat_summary结合起来,这样我就可以指定binwidth(或者让ggplot根据范围进行最佳猜测)

我是否遗漏了一些明显的信息,或者这是不可能的?

该软件包对于以“基本”
格式
命令中未涉及的方式转换日期非常有用。但后者也可以做一些聪明的事情(比如在PHP中),例如:

显示日期的给定年份和月份:

format(foo$Date, "%Y-%m")
并带有显示适当季度的包装时间:

quarters(foo$Date)
要计算2周周期,您可能找不到完整的函数,但可以根据周数轻松计算,例如:

floor(as.numeric(format(foo$Date, "%V"))/2)+1

在计算数据框中的新变量后,您可以像原始示例一样轻松地绘制数据。

使用plyr和lubridate自己完成所有计算非常简单:

library(plyr)
library(lubridate)

foo <- data.frame(
  date = sample(today() + days(1:365), 50, replace = FALSE),
  value = rnorm(50, mean = 100, sd = 25),
  type = sample(c("Red", "Blue", "Green"), 50, replace = TRUE))

foo$date2 <- floor_date(foo$date2, "week")
foosum <- ddply(foo, c("date2", "type"), summarise, 
  n = length(value),
  mean = mean(value))

ggplot(foosum, aes(date2, mean, colour = type)) +
  geom_point(aes(size = n)) + 
  geom_line()
库(plyr)
图书馆(lubridate)

foo在R中有一个strftime函数:我还没有看到lubridate包,所以这很好,从我尝试使用cut手动执行周/季度操作的过程中删除了很多代码。谢谢
library(plyr)
library(lubridate)

foo <- data.frame(
  date = sample(today() + days(1:365), 50, replace = FALSE),
  value = rnorm(50, mean = 100, sd = 25),
  type = sample(c("Red", "Blue", "Green"), 50, replace = TRUE))

foo$date2 <- floor_date(foo$date2, "week")
foosum <- ddply(foo, c("date2", "type"), summarise, 
  n = length(value),
  mean = mean(value))

ggplot(foosum, aes(date2, mean, colour = type)) +
  geom_point(aes(size = n)) + 
  geom_line()