У меня есть набор данных ежедневных значений расхода воды с гидрометрической станции примерно за 50 лет. Данные расположены в трех столбцах, а именно: «дата», «месяц», «разряд». (Пример данных показан здесь)
`
Date<- as.Date(c('1938-10-01','1954-10-27', '1967-06-16','1943-01-01','1945-01-14','1945-03-14','1954-05-04','1960-04-23','1960-05-09','1962-01-18','1968-12-19','1972-01-15','1977-08-15','1981-04-11','1986-06-20','1989-01-20','1992-03-29'))
> Months<- c('Oct','Oct','Jun','Jan','Jan','Mar','May','Apr','May','Jan','Dec','Jan','Aug','Apr','Jun','Jan','Mar')
> Dis<-c('1000','1200','400','255','450','215','360','120','145','1204','752','635','1456','154','154','1204','450')
> Sampledata<-data.frame("Date"=Date,"Months"=Months,"Disch"=Dis)
> print(Sampledata)
Date Months Disch
1 1938-10-01 Oct 1000
2 1954-10-27 Oct 1200
3 1967-06-16 Jun 400
4 1943-01-01 Jan 255
5 1945-01-14 Jan 450
6 1945-03-14 Mar 215
7 1954-05-04 May 360
8 1960-04-23 Apr 120
9 1960-05-09 May 145
10 1962-01-18 Jan 1204
11 1968-12-19 Dec 752
12 1972-01-15 Jan 635
13 1977-08-15 Aug 1456
14 1981-04-11 Apr 154
15 1986-06-20 Jun 154
16 1989-01-20 Jan 1204
17 1992-03-29 Mar 450
Я хочу рассчитать ранги за каждый месяц отдельно за все годы. Например: Рассчитайте ранг в порядке возрастания для января за 50 лет. С тем же значением ранга, присвоенным дублирующему значению разряда. Желаемый результат показан здесь:
> Date Month Disch Rank
1 1943-01-01 Jan 255 1
2 1945-01-14 Jan 450 2
3 1962-01-18 Jan 1204 4
4 1972-01-15 Jan 635 3
5 1989-01-20 Jan 1204 4
> Date Month Disch Rank
1 1945-03-14 Mar 215 1
2 1992-03-29 Mar 450 2
3 2001-03-19 Mar 450 2





Можно было бы сгруппировать по «Месяцу» и использовать одну из функций ранжирования (dense_rank, row_number(), min_rank — в зависимости от потребностей) для ранжирования столбца «Выгрузка».
library(dplyr)
df1 %>%
group_by(Month) %>%
mutate(Rank = dense_rank(Discharge))
Спасибо, что поделились этой опцией. Однако функция group_by не позволяет мне переставлять исходный набор данных в разные столбцы для каждого месяца. Поэтому я предполагаю, что функция плотности_ранка вычисляет ранги на основе всего набора данных. Я хочу иметь отдельные столбцы даты и разряда для каждого месяца, а затем вычислять ранги для столбца разряда для каждого месяца.
@Roger Не совсем понятно, какой у вас ожидаемый результат. Кроме того, изображение не помогает тестировать код. Если бы вы могли обновить свой пост небольшим примером (используя dput) и ожидаемым результатом, было бы здорово.
Виноват! Извините, что не опубликовал код. Я обновил свой пост сейчас.
Без использования каких-либо пакетов сначала преобразуйте столбцы 2 и 3 в числовые, а затем используйте ave и rank указанным методом ties. Наконец закажите результат.
Обратите внимание, что вывод, показанный в вопросе, не соответствует вводу, например. на выходе есть три строки Mar, но на входе только две такие строки, поэтому это будет соответствовать входу, но не будет идентично показанному выходу.
Sampledata2 <- transform(Sampledata,
Disch = as.numeric(as.character(Disch)),
Months = as.numeric(format(Date, "%m")))
Rank <- function(x) rank(x, ties = "min")
Sampledata3 <- transform(Sampledata2,
Rank = ave(Disch, Months, FUN = Rank))
o <- with(Sampledata3, order(Months, Date))
Sampledata3[o, ]
Спасибо, решение работает! Если бы мне нужно было получать окончательный результат отдельно за каждый месяц, что мне делать? Я попытался отфильтровать Sampledata3 за январь, и он не распечатал соответствующие строки.
S <- split(Sampledata3, Sampledata3$Months) дает список фреймов данных, по одному в месяц. Имена компонентов списка — это номера месяцев. Если вам это нужно только на один месяц, то на январь, скажем, subset(Sampledata3, Months == 1) или S[["1"]].
Идеально! Это именно то, что мне нужно! Большое спасибо!
Понятно! Извини за это. Обновил пост с кодом ввода данных.