#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()
columnyear
. iyear = 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
, и я принял ваше решение! Еще раз спасибо вам