我知道与此问题相邻的问题(here和here)之前曾提出过,但是某些假设和目标相差甚远,以至于我无法将其转化为这一问题。情况。我也是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中达到此结果的最常规方法是什么?什么是最有效的?
答案 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