【问题标题】:How to rearrange daily stream discharge data into monthly format and rank the discharge values for each month using R如何将每日流量数据重新排列为每月格式并使用 R 对每个月的流量值进行排名
【发布时间】:2019-10-16 05:46:35
【问题描述】:

我有一个测量站大约 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


【解决方案1】:

一个选项是按“月”分组并使用排名函数之一(dense_rankrow_number()min_rank - 根据需要)对“排放”列进行排名

library(dplyr)
df1 %>%
    group_by(Month) %>%
    mutate(Rank = dense_rank(Discharge))

【讨论】:

  • 感谢您分享此选项。但是 group_by 函数不允许我将原始数据集重新排列到每个月的不同列中。因此,我假设 dense_rank 函数是根据整个数据集计算排名的。我想要的是每个月都有单独的日期和放电列,然后计算每个月的放电列的排名。
  • @Roger 不清楚您的预期输出。此外,该图像无助于测试代码。如果您可以使用小示例(使用dput)和预期的输出来更新您的帖子,那就太好了
  • 我的错!抱歉没有发布代码。我现在更新了我的帖子。
【解决方案2】:

在不使用任何包的情况下,首先将第 2 列和第 3 列转换为数字,然后将 averank 与指定的 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, ]

【讨论】:

  • 谢谢,解决方案有效!如果我要分别获得每个月的最终输出,那我该怎么办?我尝试过滤 1 月份的 Sampledata3,但它没有打印相应的行。
  • S &lt;- split(Sampledata3, Sampledata3$Months) 给出一个数据帧列表,每个月一个。列表组件的名称是月份编号。如果你只需要一个月,那么一月份,比如subset(Sampledata3, Months == 1)S[["1"]]
  • 完美!这正是我需要的!非常感谢!
猜你喜欢
  • 2022-01-22
  • 2020-05-29
  • 2015-03-04
  • 2015-10-31
  • 2013-05-02
  • 2016-02-11
  • 2019-08-22
  • 2018-07-02
相关资源
最近更新 更多