在时间序列降雨数据上创建循环
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在时间序列降雨数据上创建循环相关的知识,希望对你有一定的参考价值。
我是R.的新手。我已经编写了这个代码来生成highcharter库,这是基于我有11年的数据帧,即2005年 - 2011年(4月 - 10月)
以下代码为期一年。我想创建一个循环或类似的东西,分别为每年创建图表。此代码工作正常,但我必须手动更改每年的日期并生成图表。
Year_2005_rain <- subset(Seven,
time >= as.Date('2005-04-01') &
time <= as.Date('2005-10-31'))
Year_2005_flow<- subset(Seven_flow,
time >= as.Date('2005-04-01') &
time <= as.Date('2005-10-31'))
Year_2005_inflow<- subset(Seven_inflow,
time >= as.Date('2005-04-01') &
time <= as.Date('2005-10-31'))
merge1_05 <- merge(Year_2005_rain,
Year_2005_flow,
Year_2005_inflow, by="time")
names(Year_2005_rain) <- names(Year_2005_flow) <- names(Year_2005_inflow)
merge1_05 <- rbind(Year_2005_rain, Year_2005_flow,Year_2005_inflow)
colnames(merge1_05)[colnames(merge1_05)=="time"] <- "date"
colnames(merge1_05)[colnames(merge1_05)=="Discharge"] <- "value"
merge1_05$date = as.Date(merge1_05$date, format = "%Y/%m/%d")
merge1_05$variable <- c(rep("rain", 214), rep("discharge", 214), rep("inflow", 214))
hc_14<- highchart() %>%
hc_yAxis_multiples(list(title = list(text = "rainfall depth (mm)"), reversed = TRUE),
list(title = list(text = "flow (m3/s)"), opposite = TRUE)) %>%
hc_add_series(data = filter(merge1_05, variable == "rain") %>%
mutate(value = value) %>% .$value, type = "column") %>%
hc_add_series(data = filter(merge1_05, variable == "discharge") %>% .$value,
type = "spline", yAxis = 1) %>%
hc_add_series(data = filter(merge1_05, variable == "inflow") %>% .$value,
type = "spline", yAxis = 1) %>%
hc_xAxis(categories = merge1_05$date, title = list(text = "date"))
hc_14
答案
这些代码适用于我的电脑。请将数据文件放在R脚本的同一文件夹中。
# import data and library
library(ggplot2)
library(dplyr)
library(highcharter)
Seven_flow = read.csv("Seven_flow.csv")
Seven_inflow = read.csv("Seven_inflow.csv")
Seven = read.csv("Seven.csv")
# cleanning data.
# put all the data into one dataframe.
# add a column year as the iter in for loop.
hydrograph = Seven_flow
names(hydrograph) = c("X","date", "discharge")
hydrograph$inflow = Seven_inflow$value
hydrograph$rain = Seven$value
hydrograph$date = as.Date(hydrograph$date, format = "%Y-%m-%d")
hydrograph$year = format(hydrograph$date, "%Y")
summary(hydrograph)
# plot the data in for loop.
for (year.plot in seq(2005,2011,1)){
# filter the year of interest.
hydrograph.plot = filter(hydrograph, year==year.plot)
hc_14<- highchart() %>%
hc_yAxis_multiples(list(title = list(text = "rainfall depth (mm)"), reversed
= TRUE), list(title = list(text = "flow (m3/s)"), opposite = TRUE)) %>%
hc_add_series(data = hydrograph.plot$rain , type = "column") %>%
hc_add_series(data = hydrograph.plot$discharge, type = "spline", yAxis = 1) %>%
hc_add_series(data = hydrograph.plot$inflow, type = "spline", yAxis = 1) %>%
hc_xAxis(categories = hydrograph.plot$date, title = list(text = "date"))
print(hc_14)}
另一答案
只需将处理概括为已定义的函数,其中将年份整数作为参数传递。所需要的只是动态地将yr参数与paste0()
连接到as.Date
调用,并删除任何_05后缀以避免混淆:
功能
build_graph <- function(yr) {
Year_rain <- subset(Seven,
time >= as.Date(paste0(yr,'-04-01')) &
time <= as.Date(paste0(yr,'-10-31')))
Year_flow<- subset(Seven_flow,
time >= as.Date(paste0(yr,'-04-01')) &
time <= as.Date(paste0(yr,'-10-31')))
Year_inflow<- subset(Seven_inflow,
time >= as.Date(paste0(yr,'-04-01')) &
time <= as.Date(paste0(yr,'-10-31')))
merge1 <- merge(Year_rain, Year_flow, Year_inflow, by="time")
names(Year_rain) <- names(Year_flow) <- names(Year_inflow)
merge1 <- rbind(Year_rain, Year_flow,Year_inflow)
colnames(merge1)[colnames(merge1)=="time"] <- "date"
colnames(merge1)[colnames(merge1)=="Discharge"] <- "value"
merge1$date <- as.Date(merge1$date, format = "%Y/%m/%d")
merge1$variable <- c(rep("rain", 214), rep("discharge", 214), rep("inflow", 214))
hc_14 <- highchart() %>%
hc_yAxis_multiples(list(title = list(text = "rainfall depth (mm)"), reversed=TRUE),
list(title = list(text = "flow (m3/s)"), opposite = TRUE)) %>%
hc_add_series(data = filter(merge1, variable == "rain") %>%
mutate(value = value) %>% .$value, type = "column") %>%
hc_add_series(data = filter(merge1, variable == "discharge") %>% .$value,
type = "spline", yAxis = 1) %>%
hc_add_series(data = filter(merge1, variable == "inflow") %>% .$value,
type = "spline", yAxis = 1) %>%
hc_xAxis(categories = merge1$date, title = list(text = "date"))
return(hc_14)
})
迭代
# OUTPUT TO CONSOLE (NO SAVING)
for (i in 2005:2011) {
build_graph(i)
}
# SAVING OUTPUTS TO LIST
output_list <- lapply(2005:2011, build_graph)
以上是关于在时间序列降雨数据上创建循环的主要内容,如果未能解决你的问题,请参考以下文章