Как найти строку, содержащую максимальное значение и связанный с ним год, если столбец Год содержит несколько лет в R

#r #select #time-series #max

Вопрос:

Как найти строку, содержащую максимальное значение и связанный с ним год, если столбец » Год » содержит несколько лет. Моя рамка данных содержит ежемесячные данные о стоке рек с января 2013 года по декабрь 2020 года. например, если бы я хотел найти строку, содержащую максимальный расход за 2013 год, или я хотел бы узнать как максимальный расход за 2013 год, так и дату (дату/месяц/год), связанную с этим конкретным максимальным расходом. Как бы я это сделал? в R?

Год Разряд
1/1/2013 23
2/1/2013 45
— —
12/31/2020 80

Ответ №1:

Мы можем преобразовать столбец в класс даты, получить year его как отдельный столбец, сгруппировать по и slice по max строке

 library(dplyr)
library(lubridate)
df1 %>%
    group_by(year = year(mdy(Year))) %>%
    slice_max(n = 1, order_by = Discharge) %>%
    ungroup
 

-выход

 # A tibble: 2 x 3
  Year       Discharge  year
  <chr>          <int> <dbl>
1 2/1/2013          45  2013
2 12/31/2020        80  2020
 

если в столбце » Год » несколько форматов, используйте parse_date из parsedate

 library(parsedate)
df1 %>%
    group_by(year = year(parse_date(Year))) %>%
    slice_max(n = 1, order_by = Discharge) %>%
    ungroup
 

Обновить

Основываясь dput на комментариях, столбец «Дата» уже находится в Date классе

 df1 %>%
   group_by(year= year(Date)) %>%
   slice_max(n = 1, order_by = Discharge, with_ties = FALSE) %>%
    ungroup
 

-выход

 # A tibble: 1 x 3
  Date       Discharge  year
  <date>         <dbl> <dbl>
1 2018-06-07    0.0116  2018
 

данные

 df1 <- structure(list(Year = c("1/1/2013", "2/1/2013", "12/31/2020"), 
    Discharge = c(23L, 45L, 80L)), class = "data.frame", row.names = c(NA, 
-3L))
 

Комментарии:

1. Спасибо! Я не уверен, что он вычисляет, а также получает предупреждающее сообщение, как показано ниже : Проблема с mutate() column year . i year = year(mdy(Year)) . я не смог разобрать все форматы. Форматы не найдены.

2. @SankarManalilkadaSasidharan ваш ввод показал формат даты в формате месяц/день/год. У вас есть какие-нибудь другие форматы

3. @SankarManalilkadaSasidharan попробуйте обновленный код с parse_date

4. Спасибо, но это все равно выдает мне ошибку. То, что я хотел бы найти, — это просто строка, содержащая максимальное значение разряда и связанную с ним дату. Столбец «Мой год» (например, формат 2013-01-01, 2013-01-02, 2013-01-03……до 2020-12-31) содержит несколько лет.

5. @ akrun Большое вам спасибо за помощь. код работает, но там была опечатка. Я удалил %>% перед slice_max. Большое вам спасибо df1 %>% group_by(year= year(Date)) %>% slice_max(n = 1, order_by = Discharge, with_ties = FALSE) %>% ungroup , и я принял ваше решение! Еще раз спасибо вам