Это должно сработать; Я обновил код, чтобы обеспечить презентацию в точности так, как вы указали в вопросе.
library(tibble)
library(lubridate)
library(tidyr)
library(dplyr)
library(stringr)
data <-
tribble(
~Date, ~a, ~b,
"01/20/2015", 20, 50,
"05/13/2015", 60, 70,
"10/18/2015", 22, 45,
"04/22/2016", 15, 40,
"04/25/2016", 20, 30,
"06/28/2016", 33, 45,
"01/01/2018", 90, 20,
"04/25/2018", 50, 30,
"10/19/2018" ,45, 55)
anal <-
data %>%
#here's how to manate the date bit
mutate(Date = mdy(Date),
yr = year(Date)) %>%
# then as Fnguyen's answer
group_by(yr) %>%
mutate(min_a = min(a),
max_a = max(a),
min_b = min(b),
max_b = max(b))%>%
ungroup() %>%
mutate(min_a = case_when(a == min_a ~ min_a,
TRUE ~ NA_real_),
max_a = case_when(a == max_a ~ max_a,
TRUE ~ NA_real_),
min_b = case_when(b == min_b ~ min_b,
TRUE ~ NA_real_),
max_b = case_when(b == max_b ~ max_b,
TRUE ~ NA_real_))%>%
filter(!is.na(min_a) | !is.na(max_a) | !is.na(min_b) | !is.na(max_b)) %>%
select(-c(a, b)) %>%
pivot_longer(cols = min_a:max_b, names_to = "metric", values_to = "val") %>%
na.omit() %>%
mutate(metric = factor(metric, levels = c("min_a", "max_a", "min_b", "max_b"), ordered = TRUE)) %>%
arrange(yr, metric) %>%
rowid_to_column() %>%
pivot_wider(names_from = metric, values_from = val) %>%
select(-c(rowid, yr))
anal
Что дает вам: