我有以下数据:
set.seed(123)
timeseq <- as.Date(Sys.time() + cumsum(runif(1000)*86400))
data <- rnorm(1000)
df <- data.frame(timeseq,data)
我想知道是否有人知道如何按周聚合data
。我试图做的是绘制一个时间序列ggplot,所以如果我可以跳过这一步并让ggplot处理这个更好。一直困在这一天。
答案 0 :(得分:4)
使用dplyr按周手动聚合的另一种方法。
library(dplyr)
df$weeks <- cut(df[,"timeseq"], breaks="week")
agg <- df %>% group_by(weeks) %>% summarise(agg=sum(data))
ggplot(agg, aes(as.Date(weeks), agg)) + geom_point() + scale_x_date() +
ylab("Aggregated by Week") + xlab("Week") + geom_line()
答案 1 :(得分:1)
您还可以使用numpy.isnan(A.astype(float))
函数的scale_x_date()
参数汇总日期审美。
breaks
答案 2 :(得分:0)
要获得本周,我们可以使用lubridate
库,floor_date
函数如下:
library(lubridate)
df$week <- floor_date(df$timeseq, "week")
我们可以使用ggplot
通过执行统计信息摘要来绘制数据(可能有更好的方法吗?),它看起来像这样:
stat_sum_single <- function(fun, geom="point", ...) {
stat_summary(fun.y=fun, colour="red", geom=geom, size = 3, ...)
}
ggplot(df, aes(x=floor_date(timeseq, "week"), y=data)) +
stat_sum_single(sum, geom="line") +
xlab("week")
将输出:
答案 3 :(得分:0)
我想扩展@chappers使用软件包lubridate
的想法,但要采用完全管道的方式。
library(dplyr)
library(ggplot2)
library(lubridate)
set.seed(123)
data.frame(
timeseq = as.Date(Sys.time() + cumsum(runif(1000) * 86400)),
data = rnorm(1000)
) %>%
mutate(timeseq = floor_date(timeseq, unit = "week")) %>%
group_by(timeseq) %>%
summarise(data = sum(data)) %>%
ggplot() +
geom_line(aes(x = timeseq, y = data))
如果data.frame
行已经存储为对象,请用df
替换行。