У меня есть набор данных ежедневных значений расхода потока с гидрометрической станции в течение примерно 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
r
0
Roger 30 Май 2019 в 17:41

2 ответа

Лучший ответ

Без использования каких-либо пакетов сначала преобразуйте столбцы 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, ]
0
G. Grothendieck 31 Май 2019 в 14:49

Можно было бы сгруппировать по «Месяцу» и использовать одну из функций ранжирования (dense_rank, row_number(), min_rank - в зависимости от потребностей) для ранжирования столбца «Сброс»

library(dplyr)
df1 %>%
    group_by(Month) %>%
    mutate(Rank = dense_rank(Discharge))
0
akrun 30 Май 2019 в 14:43