根据R中的日期对子设置行

根据R中的日期对子设置行,r,dplyr,R,Dplyr,我试图解决R中的一个问题。我有两个数据帧,看起来像这样: df1 <- Date Rainfall_Duration 6/14/2016 10 6/15/2016 20 6/17/2016 10 8/16/2016 30 8/19/2016 40 df2 <- Date Removal.Rate 6/17/2016 64.7 6/30/2016 22.63 7/14/2

我试图解决R中的一个问题。我有两个数据帧,看起来像这样:

df1 <- 
  Date    Rainfall_Duration 
6/14/2016       10 
6/15/2016       20 
6/17/2016       10 
8/16/2016       30 
8/19/2016       40 

df2 <- 
  Date    Removal.Rate 
6/17/2016    64.7 
6/30/2016    22.63 
7/14/2016    18.18 
8/19/2016    27.87 
df3<- 
Rate.Removal.Date    Date       Rainfall_Duration 
6/17/2016                6/14/2016               10 
6/17/2016                6/15/2016               20 
6/17/2016                6/17/2016               10 
6/30/2016                6/14/2016               10 
6/30/2016                6/15/2016               20 
6/30/2016                6/17/2016               10 
7/14/2016                6/14/2016               10 
7/14/2016                6/15/2016               20 
7/14/2016                6/17/2016               10 
8/19/2016                8/16/2016               30 
8/19/2016                8/19/2016               40 

df1我将通过显式生成所有要收集降雨持续时间的日期,然后绑定来实现这一点

为此,我对每一行进行了
split
,并为每一行生成了一个
rainfallDate
列,其中包括前七天。然后,我将这些行重新绑定在一起,并使用
left\u join
获取降雨数据。最后,我过滤掉缺少降雨信息的行

df2 %>%
  split(1:nrow(.)) %>%
  lapply(function(x){
    data.frame(
      x
      , rainfallDate = seq(x$Date - 7, x$Date, 1)
    )
  }) %>%
  bind_rows() %>%
  left_join(df1, by = c(rainfallDate = "Date")) %>%
  filter(!is.na(Rainfall_Duration))
给予

请注意,如果没有降雨信息的日期实际上是0,您可以跳过过滤行,并使用
tidyr
中的
replace_na
将其设置为显式零(例如,如果您希望平均降雨量或包括之前没有任何降雨的移除日期)

如果您确实对每个日期的汇总值感兴趣(例如,过去七天的总降雨量),则可以使用其他方法。首先,我将生成一个降雨数据集,该数据集实际上包含每天观测的条目。为此,我使用
complete
from
tidyr
为每天添加一个明确的零条目,然后使用
rollapply
from
zoo
计算前七天滚动的总和

completeRainfall <-
  df1 %>%
  complete(Date = full_seq(c(as.Date("2016-06-10"), max(Date)), 1)
           , fill = list(Rainfall_Duration = 0)) %>%
  mutate(prevSeven = rollapply(Rainfall_Duration, 7, sum
                               , fill = NA, align = "right"))
给予

        Date Removal.Rate rainfallDate Rainfall_Duration
1 2016-06-17        64.70   2016-06-14                10
2 2016-06-17        64.70   2016-06-15                20
3 2016-06-17        64.70   2016-06-17                10
4 2016-08-19        27.87   2016-08-16                30
5 2016-08-19        27.87   2016-08-19                40
completeRainfall <-
  df1 %>%
  complete(Date = full_seq(c(as.Date("2016-06-10"), max(Date)), 1)
           , fill = list(Rainfall_Duration = 0)) %>%
  mutate(prevSeven = rollapply(Rainfall_Duration, 7, sum
                               , fill = NA, align = "right"))
left_join(
  df2
  , completeRainfall
)
        Date Removal.Rate Rainfall_Duration prevSeven
1 2016-06-17        64.70                10        40
2 2016-06-30        22.63                 0         0
3 2016-07-14        18.18                 0         0
4 2016-08-19        27.87                40        70