使用R

时间:2018-07-14 18:42:10

标签: r

我知道与此问题相邻的问题(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中达到此结果的最常规方法是什么?什么是最有效的?

2 个答案:

答案 0 :(得分:0)

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

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)

答案 1 :(得分:0)

一种简单的基础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