Создание цикла по временным рядам данных об осадках

Я новичок в R. Я написал этот код для генерации с помощью библиотеки highcharter. Он основан на фрейме данных, который у меня есть за 11 лет, то есть с 2005 по 2011 год (с апреля по октябрь)

Следующий код рассчитан на один год. Я хочу создать цикл или что-то подобное, чтобы создать диаграмму для каждого года отдельно. Этот код работает нормально, но мне приходится вручную менять дату каждого года и создавать диаграмму.

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

person whj    schedule 02.03.2018    source источник
comment
Можете ли вы поделиться своими данными с помощью dput()? Подробнее см. здесь meta.stackoverflow.com/questions/315885/   -  person Tung    schedule 02.03.2018
comment
Я думаю, вы можете попробовать обернуть это в функцию. Затем вы можете вызвать функцию для построения данных.   -  person Wenlong Liu    schedule 02.03.2018
comment
Если есть примеры данных, я могу помочь вам поработать над этой функцией.   -  person Wenlong Liu    schedule 02.03.2018
comment
@WenlongLiu Если бы вы могли помочь мне с функцией, было бы неплохо, вот ссылка для данных drive.google.com/open?id=1I76ASCvu7V7Iv-MjeVAAXONnyJqCyOWi   -  person whj    schedule 02.03.2018
comment
@Tung Я хочу поделиться данными, которые я использовал в этом примере, и они слишком велики, чтобы ими можно было поделиться с помощью dput(). Я добавил ссылку на диск Google для данных.   -  person whj    schedule 02.03.2018
comment
Чтобы добавить немного больше о данных, я использую три фрейма данных, разбивая их по дате и снова объединяя их для hc , имена данных (Seven, Seven_flow, Seven_inflow)   -  person whj    schedule 02.03.2018
comment
@whj: пожалуйста, добавьте ссылку на свои данные в вопрос   -  person Tung    schedule 02.03.2018


Ответы (2)


Эти коды работают на моем компьютере. Поместите файлы данных в ту же папку, что и сценарии 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)}
person Wenlong Liu    schedule 02.03.2018
comment
@whj, не связанный с визуализацией данных, но ваши данные выглядят странно. Иногда сброс не реагирует на сильные дожди в вашем районе. - person Wenlong Liu; 02.03.2018
comment
Я думаю, что поток регулируется плотиной. - person Tung; 02.03.2018
comment
@WenlongLiu Спасибо, у меня код сработал нормально, в этом районе нет плотины, но есть некоторое расстояние между станциями сброса и сброса осадков, и территория между станциями сброса осадков и станцией сброса также часто затопляется. Это может быть причиной - person whj; 03.03.2018
comment
@WenlongLiu, не могли бы вы также взглянуть на мой другой вопрос? stackoverflow.com/ вопросы/49078775/ - person whj; 03.03.2018

Просто обобщите свою обработку в определенную функцию, в которой вы передаете целые числа года в качестве параметра. Все, что нужно, — это динамически объединить параметры 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)
person Parfait    schedule 02.03.2018
comment
Спасибо, я упростил некоторые из моих других кодов с вашими предложениями. - person whj; 03.03.2018