R Markdown

library(dplyr)
## Warning: pakiet 'dplyr' został zbudowany w wersji R 4.5.2
## 
## Dołączanie pakietu: 'dplyr'
## Następujące obiekty zostały zakryte z 'package:stats':
## 
##     filter, lag
## Następujące obiekty zostały zakryte z 'package:base':
## 
##     intersect, setdiff, setequal, union
library(tidyr)
## Warning: pakiet 'tidyr' został zbudowany w wersji R 4.5.2
library(ggplot2)
## Warning: pakiet 'ggplot2' został zbudowany w wersji R 4.5.2
list.files()
## [1] "analiza_klimatu.Rproj"    "Analiza_klimatyczna.html"
## [3] "Analiza_klimatyczna.log"  "Analiza_klimatyczna.Rmd" 
## [5] "Analiza_klimatyczna.tex"  "data"
col_names <- c(
  "Kod_stacji", 
  "Nazwa_stacji", 
  "Rok", 
  "Miesiac", 
  "Miesieczna_suma_opadow", 
  "Status_pomiaru_SUMM",
  "Liczba_dni_z_opadem_sniegu", 
  "Status_pomiaru_LDS", 
  "Opad_maksymalny",
  "Status_pomiaru_MAXO",
  "Dzien_pierwszy_opad",
  "Dzien_ostatni_opad",
  "Liczba_dni_z_pokrywa_sniezna",
  "Status_pomiaru_LDPS"
)

files_list <- list.files(path="data",pattern = "\\.csv$", full.names = TRUE)

# Sprawdzenie, ile plików znaleziono
print(paste("Znaleziono plików do wczytania:", length(files_list)))
## [1] "Znaleziono plików do wczytania: 21"
# Funkcja lapply, read.csv dla każdego pliku z files_list.
data_list <- lapply(files_list, read.csv, 
                    header = FALSE, # W plikach nie ma nagłówków
                    col.names = col_names, # Użyj zdefiniowanych nazw
                    sep = ",", # Pliki są rozdzielone przecinkami
                    stringsAsFactors = FALSE, 
                    # Zastąp kody braku danych na NA (zgodnie z opisem 99999/999.9 i inne kody)
                    na.strings = c("99999", "999.9", "9999", "99.9", "99", "NA", ""))

# 4. Połączenie wszystkich ramek danych w jedną, dużą tabelę (df_raw)
df_raw <- bind_rows(data_list)

message(paste("Dane są wczytane i połączone. Łączna liczba wierszy:", nrow(df_raw)))
## Dane są wczytane i połączone. Łączna liczba wierszy: 202667
df_cleaned <- df_raw %>%
  # Użycie funkcji mutate do zmiany i tworzenia nowych kolumn
  mutate(
    # Zmiana formatu dla sumy opadów
    Miesieczna_suma_opadow = as.numeric(gsub(",", ".", Miesieczna_suma_opadow)),
    
    # Zmiana formatu dla dni ze śniegiem
    Liczba_dni_z_opadem_sniegu = as.numeric(gsub(",", ".", Liczba_dni_z_opadem_sniegu)),
    
    # Konwersja Roku i Miesiąca na liczby całkowite
    Rok = as.integer(Rok),
    Miesiac = as.integer(Miesiac)
  ) %>%
  
  # 1. Wybór tylko potrzebnych kolumn (selekcja)
  select(Nazwa_stacji, Rok, Miesiac, Miesieczna_suma_opadow, Liczba_dni_z_opadem_sniegu)

message("Kolumny zostały wyczyszczone i wybrane.")
## Kolumny zostały wyczyszczone i wybrane.
df_processed <- df_cleaned %>%
  # Używamy mutate do dodania nowej kolumny 'hydro_year'
  mutate(
    # Jeśli miesiąc to 11 (Listopad) lub 12 (Grudzień), 
    # to hydro_year jest równy Rok + 1.
    # Dla pozostałych miesięcy (1-10) jest równy Rok.
    hydro_year = ifelse(Miesiac %in% c(11, 12), Rok + 1, Rok)
  ) %>%
  # Ograniczenie do zakresu z zadania: pełne lata hydrologiczne 2003-2023
  filter(hydro_year >= 2003 & hydro_year <= 2023)

message("Zdefiniowano kolumnę 'hydro_year' i wybrano właściwy zakres lat.")
## Zdefiniowano kolumnę 'hydro_year' i wybrano właściwy zakres lat.
analiza_hydro <- df_processed %>%
  # 1. Grupujemy po roku hydrologicznym ORAZ nazwie stacji
  group_by(hydro_year, Nazwa_stacji) %>%
  summarise(
    # Obliczamy roczną SUMĘ opadów dla tej stacji
    Suma_opadow_roczna = sum(Miesieczna_suma_opadow, na.rm = TRUE),
    # Obliczamy roczną SUMĘ dni ze śniegiem dla tej stacji
    Suma_dni_snieg_roczna = sum(Liczba_dni_z_opadem_sniegu, na.rm = TRUE),
    .groups = 'drop' # Usuwamy grupowanie po stacji
  ) %>%
  
  # 2. Następnie grupujemy tylko po roku hydrologicznym
  group_by(hydro_year) %>%
  summarise(
    # Obliczamy ŚREDNIĄ z rocznych sum opadów ze WSZYSTKICH stacji
    Srednia_suma_opadow = mean(Suma_opadow_roczna, na.rm = TRUE),
    # Obliczamy ŚREDNIĄ z rocznych sum dni ze śniegiem ze WSZYSTKICH stacji
    Srednia_liczba_dni_snieg = mean(Suma_dni_snieg_roczna, na.rm = TRUE)
  )
message("Obliczono statystyki: Srednia_suma_opadow i Srednia_liczba_dni_snieg.")
## Obliczono statystyki: Srednia_suma_opadow i Srednia_liczba_dni_snieg.
library(ggplot2)

# Wykres 1 - średnia suma opadów (Y) w funkcji roku hydrologicznego (X)
wykres1 <- analiza_hydro %>%
  ggplot(aes(x = hydro_year, y = Srednia_suma_opadow)) +
  # Linia i punkty dla danych rocznych
  geom_line(color = "darkblue", linewidth = 1) +
  geom_point(color = "darkblue", size = 2) +
  # Dodanie trendu liniowego (regresja liniowa)
  geom_smooth(method = 'lm', se = FALSE, color = "red", linetype = "dashed") +
  labs(
    title = "Trend średniej rocznej sumy opadów (hydro_year 2003-2023)",
    x = "Rok hydrologiczny",
    y = "Średnia roczna suma opadów [mm]"
  ) +
  theme_minimal()

print(wykres1)
## `geom_smooth()` using formula = 'y ~ x'

# Wykres 2 - średnia liczba dni ze śniegiem (Y) w funkcji roku hydrologicznego (X)
wykres2 <- analiza_hydro %>%
  ggplot(aes(x = hydro_year, y = Srednia_liczba_dni_snieg)) +
  # Linia i punkty dla danych rocznych
  geom_line(color = "darkgreen", linewidth = 1) +
  geom_point(color = "darkgreen", size = 2) +
  # Dodanie trendu liniowego (regresja liniowa)
  geom_smooth(method = 'lm', se = FALSE, color = "red", linetype = "dashed") +
  labs(
    title = "Trend średniej rocznej liczby dni z opadem śniegu (hydro_year 2003-2023)",
    x = "Rok hydrologiczny",
    y = "Średnia roczna liczba dni z opadem śniegu"
  ) +
  theme_minimal()

print(wykres2)
## `geom_smooth()` using formula = 'y ~ x'