在次年10月15日至4月30日创造独特的序列 - R.

时间:2016-12-14 16:01:28

标签: r date sequence

基本上,我正在查看积雪数据。我希望在10月15日到次年5月15日(当然是冬季)〜215天期间为每个日期(第" snowday")分配一个唯一值。然后添加一个专栏" snowmonth"这对应于季节性数据的连续月份,以及“雪年”#34;表示每个季节性记录开始年份的列。

但是有一些缺失的日期 - 但是 - 不是找到那些日期并将NA插入行中,而是选择跳过该步骤而是去顺序根,然后可以用尊重" snowmonth"

基本上,我只需要得到" snowday"大约1:215的序列(列中的闰年为+1,其余的我可以自己做。看起来像这样

month day year depth    date yearday snowday snowmonth
  12  26 1955    27 1955-12-26     360      NA        NA
  12  27 1955    24 1955-12-27     361      NA        NA
  12  28 1955    24 1955-12-28     362      NA        NA
  12  29 1955    24 1955-12-29     363      NA        NA
  12  30 1955    26 1955-12-30     364      NA        NA
  12  31 1955    26 1955-12-31     365      NA        NA
   1   1 1956    25 1956-01-01       1      NA        NA
   1   2 1956    25 1956-01-02       2      NA        NA
   1   3 1956    26 1956-01-03       3      NA        NA


man<-data.table()
man <-  read.delim('mansfieldstake.txt',header=TRUE, check.names=FALSE)
man[is.na(man)]<-0
man$date<-paste(man$yy, man$mm, man$dd,sep="-", collapse=NULL)
man$yearday<-NA #day of the year 1-365
colnames(man)<- c("month","day","year","depth", "date","yearday")

man$date<-as.Date(man$date)
man$yearday<-yday(man$date)
man$snowday<-NA
man$snowmonth<-NA
man[420:500,]
head(man)

输出看起来像这样:

month day year depth    date    yearday   snowday   snowmonth
  12  26 1955    27 1955-12-26     360      73        3
  12  27 1955    24 1955-12-27     361      74        3
  12  28 1955    24 1955-12-28     362      75        3
  12  29 1955    24 1955-12-29     363      76        3
  12  30 1955    26 1955-12-30     364      77        3
  12  31 1955    26 1955-12-31     365      78        3
   1   1 1956    25 1956-01-01       1      79        4
   1   2 1956    25 1956-01-02       2      80        4
   1   3 1956    26 1956-01-03       3      81        4

我已经考虑了循环以及所有这些 - 但它效率低下......闰年有点混乱 - 这比我想象的更具挑战性。不错的第一个项目!

在这里寻找一个简单的序列,放弃所有非雪月。感谢任何有输入的人!

1 个答案:

答案 0 :(得分:0)

如果我理解正确snowday应该是自季节开始以来的天数,那么使用data.table制作此专栏所需的全部内容是:

day_one <- as.Date("1955-10-01")
man[, snowday := -(date - day_one)]

如果您想要的只是一系列唯一值,那么seq()是您最好的选择。

然后您可以使用

创建snowmonth
library(lubridate)
man[, snowmonth := floor(-time_length(interval(date, day_one), unit = "month"))