【发布时间】:2017-03-09 01:43:53
【问题描述】:
我想从 10 分钟时间序列中生成每月图。每个数据集的时间序列的开始和结束都不同,因此它应该可以正常工作。此外,还应为不同的变量生成图。
多年来,我有一个非常丑陋的解决方案,其中有一个循环,几个月后又有一个循环,虽然有效,但也会产生一些空的额外情节。我希望代码使它更易于理解。
library(dplyr)
library(readr)
library(tidyverse)
library(ggplot2)
library(lubridate)
#test data:
TDF <- tibble(DATE = seq( make_datetime(2007,09,23,06,00), make_datetime(2008,07,05,23,00), by = 600),
V1 = round(runif(length(DATE)),2),
V2 = round(runif(length(DATE)),2),
V3 = round(runif(length(DATE)),2)
)
for (year in min( year( TDF$DATE)) : max( year( TDF$DATE))) {
for (mon in min( month( TDF$DATE)) : max( month( TDF$DATE))) {
for (var in c( "V1", "V2", "V3")) {
filename <- paste0("Abb/", var, "_", year, "-", mon, "_ZR.png")
png(filename, width = 1800, height = 900, res = 200)
p <- ggplot( TDF[ year(TDF$DATE) == year & month(TDF$DATE) == mon,])
p <- p + geom_line( aes_string( "DATE", paste0(var)))
print(p)
graphics.off()
}
}
}
所以,一定有更好的方法。我现在正在努力解决这个问题(相同的测试数据):
yearmonmin <- TDF$DATE %>% min() %>% floor_date(unit = "month")
yearmonmax <- TDF$DATE %>% max() %>% ceiling_date(unit = "month")
seq(yearmonmin, yearmonmax, by = "month")
for (yearmon in seq(yearmonmin, yearmonmax, by = "month")) {
print(var)
}
这真的让我很困惑,因为
> seq(yearmonmin, yearmonmax, by = "month")
[1] "2007-09-01 UTC" "2007-10-01 UTC" "2007-11-01 UTC" "2007-12-01 UTC" "2008-01-01 UTC" "2008-02-01 UTC" "2008-03-01 UTC" "2008-04-01 UTC"
[9] "2008-05-01 UTC" "2008-06-01 UTC" "2008-07-01 UTC" "2008-08-01 UTC"
但是
> for (yearmon in seq(yearmonmin, yearmonmax, by = "month")) {
+ print(yearmon)
+ }
[1] 1188604800
[1] 1191196800
[1] 1193875200
[1] 1196467200
[1] 1199145600
[1] 1201824000
[1] 1204329600
[1] 1207008000
[1] 1209600000
[1] 1212278400
[1] 1214870400
[1] 1217548800
我已经尝试了seq.Date 和两天的其他不值得在这里展示的替代品...
我听说在 R 中最好避免循环。所以...有人吗?
【问题讨论】:
标签: r loops date ggplot2 dplyr