【问题标题】:Reorder data frame from calendar year to water year using R使用 R 将数据框从日历年重新排序为水年
【发布时间】:2018-07-14 18:42:10
【问题描述】:

我知道之前已经提出过与此问题相关的问题(herehere),但一些假设和目标不同,我无法将其转化为这种情况。我也是R新手。

我有一个结构如下的数据框:

STATION     DATE        PRCP 
USC00352972 1910-01-01  0 
USC00352972 1910-02-01  0   
USC00352972 1910-03-01  0
USC00352972 1910-04-01  0
USC00352972 1910-05-01  0
USC00352972 1910-06-01  0
USC00352972 1910-07-01  0
USC00352972 1910-08-01  0
USC00352972 1910-09-01  0
USC00352972 1910-10-01  0
USC00352972 1910-11-01  0
USC00352972 1910-12-01  0
...         ...         .
US1ORLA0076 2018-01-01  0
US1ORLA0076 2018-02-01  0
US1ORLA0076 2018-03-01  0
US1ORLA0076 2018-04-01  0
US1ORLA0076 2018-05-01  0
US1ORLA0076 2018-06-01  0
US1ORLA0076 2018-07-01  0
US1ORLA0076 2018-08-01  0
US1ORLA0076 2018-09-01  0
US1ORLA0076 2018-10-01  0
US1ORLA0076 2018-11-01  0
US1ORLA0076 2018-12-01  0

数据包含数十个站点和数十万个观测值。它按车站字母顺序列出,然后按日历年(1-12 月)排序。

我想重新排列此数据集,使其按我们的“水年”(10 月至 9 月)列出。从概念上讲,这很简单:

对于每一行(按时间顺序)> 如果该行的月份是 10-12 > 将该行直接放在其车站最早日期行的上方。

但我怀疑这种逻辑是否符合 R 语言,而且我不确定如何对其进行编码。在 R 中实现此结果的最常规方法是什么?什么是最有效的?

【问题讨论】:

  • 你不应该重新排序数据:如果month < 10,降水属于上一个水年
  • 你是对的。我错误地认为我需要将所有 10-12 月份的条目的月份值更改为 1-3。但实际上,我需要将所有 10-12 个月的条目的年份值更改为 year+1,将这些月份分配到下一年。而且,正如下面的答案所暗示的,我应该创建一个包含水年值的新列,允许我按水年组织条目而不改变它们的日期。

标签: r


【解决方案1】:

一种选择是引入一个新列,数据将在该列上排列。可以从月份在Oct - Dec 之间的日期中减去1 year,以便这些行的数据与前几年/期间一起显示。

library(dplyr)
library(lubridate)

df %>% mutate(DATE = ydm(DATE)) %>%
  mutate(WaterPeriod = 
      as.Date(ifelse(month(DATE)>=10, DATE-years(1), DATE),origin = "1970-01-01")) %>%
  arrange(STATION, WaterPeriod) %>%
  select(-WaterPeriod)

【讨论】:

    【解决方案2】:

    一个简单的基本 R 方法。
    如果月份是 10 月、11 月或 12 月,则将第一年移至第一年。

    xd <- as.Date(seq(1, 1500, by=80), origin="1910-01-01")
    
    w.year <- as.numeric(format(xd, "%Y"))
    oct.nov.dec <- as.numeric(format(xd, "%m")) > 9
    w.year[oct.nov.dec] <- w.year[oct.nov.dec] + 1
    
    data.frame("Calendar_date"=xd, "Water_year"=w.year)
    
    #    Calendar_date Water_year
    # 1     1910-01-02       1910
    # 2     1910-03-23       1910
    # 3     1910-06-11       1910
    # 4     1910-08-30       1910
    # 5     1910-11-18       1911
    # 6     1911-02-06       1911
    # 7     1911-04-27       1911
    # 8     1911-07-16       1911
    # 9     1911-10-04       1912
    # 10    1911-12-23       1912
    # 11    1912-03-12       1912
    # 12    1912-05-31       1912
    # 13    1912-08-19       1912
    # 14    1912-11-07       1913
    # 15    1913-01-26       1913
    # 16    1913-04-16       1913
    # 17    1913-07-05       1913
    # 18    1913-09-23       1913
    # 19    1913-12-12       1914
    

    【讨论】:

      猜你喜欢
      • 2017-03-05
      • 2018-12-24
      • 2022-06-12
      • 2019-02-05
      • 1970-01-01
      • 2021-12-16
      • 1970-01-01
      • 2019-07-18
      • 1970-01-01
      相关资源
      最近更新 更多