File size: 2,373 Bytes
69c6bb6 6120561 69c6bb6 6120561 69c6bb6 6120561 69c6bb6 6120561 69c6bb6 6120561 69c6bb6 6120561 69c6bb6 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
#' Add seasonal columns to data
#'
#' Optimized to avoid date conversion for every row.
#' @param data DataFrame containing year and month columns
#' @return DataFrame with added season_id and season columns
add_seasonal_columns <- function(data) {
# Define season mapping: 12,1,2->DJF; 3,4,5->MAM; 6,7,8->JJA; 9,10,11->SON
# We can use a lookup vector.
# Month is 1..12.
season_lookup <- c(
"DJF", "DJF", # 1, 2
"MAM", "MAM", "MAM", # 3, 4, 5
"JJA", "JJA", "JJA", # 6, 7, 8
"SON", "SON", "SON", # 9, 10, 11
"DJF" # 12
)
data %>%
mutate(
season_id = (12 * year + month) %/% 3,
season = season_lookup[month]
)
}
#' Filter seasonal data by date range and selected season
#'
#' @param data DataFrame with seasonal columns
#' @param selected_season Character, e.g., "DJF", "MAM"
#' @return Filtered DataFrame
filter_seasonal_data <- function(data, selected_season) {
# Range: 1901-03-01 to 2023-11-30
# This corresponds to:
# Start: Year > 1901 OR (Year == 1901 and Month >= 3)
# End: Year < 2023 OR (Year == 2023 and Month <= 11)
data %>%
filter(
(year > 1901 | (year == 1901 & month >= 3)) &
(year < 2023 | (year == 2023 & month <= 11)),
season == selected_season
)
}
#' Aggregate data by season with completeness check
#'
#' Only calculates the mean/sum if all 3 months of the season are present.
#' @param data DataFrame with season_id
#' @param selected_variable Character, "PREC" or other
#' @return Aggregated DataFrame
aggregate_seasonal <- function(data, selected_variable) {
data %>%
group_by(id, season_id, season, name, latitude, longitude, altitude) %>%
# Calculate the "year" for the season (usually the year of the last month, or just max year in the group)
# For DJF (Dec 2022, Jan 2023, Feb 2023), usually denoted as Winter 2023.
# We can use max(year) as the season year.
summarise(
n_months = n(),
value = if (selected_variable == "PREC") sum(value, na.rm = TRUE) else mean(value, na.rm = TRUE),
year = max(year),
.groups = "drop"
) %>%
# STICT COMPLETENESS CHECK: Only keep seasons with 3 months
filter(n_months == 3) %>%
dplyr::select(-n_months)
}
|