代码之家  ›  专栏  ›  技术社区  ›  user6985

如何在R循环中用日期对数据进行子集?

  •  0
  • user6985  · 技术社区  · 5 年前

    我需要子集降水数据,并在一个循环中做我需要的计算,这样日期将是一个60天的窗口。

    例如,在下面的代码中,我对2013-08-15到2013-10-15的数据进行了次设置。 下一次迭代的日期是2013年10月16日。。。。

     # subset 2 months around flood
    
    
    precip_boulder_AugOct <- boulder_daily_precip %>%
                            filter(DATE >= as.Date('2013-08-15') & DATE <= as.Date('2013-10-15'))
    
    0 回复  |  直到 5 年前
        1
  •  0
  •   ladylala    5 年前

    如果我理解你的问题,这里有一个方法。你需要摆弄日期:你到底想要60天(含60天)、60天(不含60天)还是2个月?

    我创建了一个假的数据集 DATE val 柱。

    library(dplyr)
    library(lubridate)
    
    # Parameters
    FIRST_INITIAL_DATE <- ymd("2013-08-15")
    FINAL_INITIAL_DATE <- ymd("2014-08-15")
    RANGE_DAYS <- 60
    
    # Create vector of initial dates (before adding 60 days)
    initial_dates <- seq(FIRST_INITIAL_DATE, FINAL_INITIAL_DATE, by = "days")
    # Create vector of all dates (beginning with FIRST_INITIAL_DATE, ending with 60 + FINAL_INITIAL_DATE)
    all_dates <- c(initial_dates, initial_dates[length(initial_dates)] + 1:RANGE_DAYS)
    
    # Create fake data
    boulder_daily_precip <- data.frame(
      DATE = all_dates,
      val = runif(n = length(all_dates))
    )
    
    # Obviously you need to change this loop.  Currently `precip_boulder_AugOct` gets overwritten so this represents the last window.
    for (date in initial_dates) {
      precip_boulder_AugOct <- boulder_daily_precip %>%
        filter(DATE >= date & DATE <= date + RANGE_DAYS)
    }
    
    precip_boulder_AugOct
    ##          DATE         val
    ## 1  2014-08-15 0.163611388
    ## 2  2014-08-16 0.816459793
    ## 3  2014-08-17 0.859669117
    ## ...
    ## 60 2014-10-13 0.514661876
    ## 61 2014-10-14 0.143665303
    

        2
  •  0
  •   Ben373    5 年前

    A base R 解决方案

    你开始设定你的开始日期

    start <- as.Date('2013-08-15', origin='1970-01-01')
    

    因为R会把它当作一个双精度的,所以你可以简单地添加一些东西。

    (end <- start+60)
    > [1] "2013-10-14"
    

    你甚至可以用它来创建向量

    (timerange <- as.Date(start:end, origin='1970-01-01'))
     [1] "2013-08-15" "2013-08-16" "2013-08-17" "2013-08-18" "2013-08-19" "2013-08-20" "2013-08-21" "2013-08-22" "2013-08-23" "2013-08-24" "2013-08-25" "2013-08-26"
    [13] "2013-08-27" "2013-08-28" "2013-08-29" "2013-08-30" "2013-08-31" "2013-09-01" "2013-09-02" "2013-09-03" "2013-09-04" "2013-09-05" "2013-09-06" "2013-09-07"
    [25] "2013-09-08" "2013-09-09" "2013-09-10" "2013-09-11" "2013-09-12" "2013-09-13" "2013-09-14" "2013-09-15" "2013-09-16" "2013-09-17" "2013-09-18" "2013-09-19"
    [37] "2013-09-20" "2013-09-21" "2013-09-22" "2013-09-23" "2013-09-24" "2013-09-25" "2013-09-26" "2013-09-27" "2013-09-28" "2013-09-29" "2013-09-30" "2013-10-01"
    [49] "2013-10-02" "2013-10-03" "2013-10-04" "2013-10-05" "2013-10-06" "2013-10-07" "2013-10-08" "2013-10-09" "2013-10-10" "2013-10-11" "2013-10-12" "2013-10-13"
    [61] "2013-10-14"
    

    for(i in seq(0,1000,61)){
      precip_boulder_AugOct <- boulder_daily_precip %>%
        filter(DATE >= as.Date(start+i, origin='1970-01-01') & DATE <= as.Date(start+i+60, origin='1970-01-01'))  
    }
    

    或者任何你喜欢的循环