R操纵日期数据框,以包括每个日期前7天

R操纵日期数据框,以包括每个日期前7天,r,date,data-manipulation,R,Date,Data Manipulation,我目前有一个日期、纬度和经度的数据框,代表所采集的样本。下面是一个简单的例子: Date Lat lon 1 1996-03-12 -33 153 2 2004-07-15 -35 160 3 2008-07-26 -28 155 我想生成一个表,将每个日期/lat/long组合之前的7天相加,这样我就可以从一些大型环境模型中提取前置数据,但我不知道如何生成较大的表,上面小表的示例输出如下: Date Lat lon 1 1996-03-12 -33 15

我目前有一个日期、纬度和经度的数据框,代表所采集的样本。下面是一个简单的例子:

        Date Lat lon
1 1996-03-12 -33 153
2 2004-07-15 -35 160
3 2008-07-26 -28 155

我想生成一个表,将每个日期/lat/long组合之前的7天相加,这样我就可以从一些大型环境模型中提取前置数据,但我不知道如何生成较大的表,上面小表的示例输出如下:

         Date Lat lon
1  1996-03-12 -33 153
2  1996-03-11 -33 153
3  1996-03-10 -33 153
4  1996-03-09 -33 153
5  1996-03-08 -33 153
6  1996-03-07 -33 153
7  1996-03-06 -33 153
8  2004-07-15 -35 160
9  2004-07-14 -35 160
10 2004-07-13 -35 160
11 2004-07-12 -35 160
12 2004-07-11 -35 160
13 2004-07-10 -35 160
14 2004-07-09 -35 160
15 2008-07-26 -28 155
16 2008-07-25 -28 155
17 2008-07-24 -28 155
18 2008-07-23 -28 155
19 2008-07-22 -28 155
20 2008-07-21 -28 155
21 2008-07-20 -28 155

使用
tidyr::complete
实现此目的的一种方法是为每行创建一个从
date-6
date
的日期序列

library(dplyr)
library(tidyr)

df %>%
  mutate(Date = as.Date(Date)) %>%
  group_by(row = row_number()) %>%
  complete(Date = seq(Date - 6, Date, "day")) %>%
  ungroup %>%
  arrange(row, desc(Date)) %>%
  fill(Lat, lon)


# A tibble: 21 x 3
#   Date         Lat   on
#   <date>     <int> <int>
# 1 1996-03-12   -33   153
# 2 1996-03-11   -33   153
# 3 1996-03-10   -33   153
# 4 1996-03-09   -33   153
# 5 1996-03-08   -33   153
# 6 1996-03-07   -33   153
# 7 1996-03-06   -33   153
# 8 2004-07-15   -35   160
# 9 2004-07-14   -35   160
#10 2004-07-13   -35   160
# … with 11 more rows
库(dplyr)
图书馆(tidyr)
df%>%
变异(日期=as.Date(日期))%>%
分组依据(行=行编号())%>%
完成(日期=序号(日期-6,日期,“天”))%>%
解组%>%
排列(行,描述(日期))%>%
填充(横向、纵向)
#一个tibble:21x3
#星期日
#         
# 1 1996-03-12   -33   153
# 2 1996-03-11   -33   153
# 3 1996-03-10   -33   153
# 4 1996-03-09   -33   153
# 5 1996-03-08   -33   153
# 6 1996-03-07   -33   153
# 7 1996-03-06   -33   153
# 8 2004-07-15   -35   160
# 9 2004-07-14   -35   160
#10 2004-07-13   -35   160
#…还有11排
数据

df <- structure(list(Date = structure(1:3, .Label = c("1996-03-12", 
"2004-07-15", "2008-07-26"), class = "factor"), Lat = c(-33L, 
-35L, -28L), lon = c(153L, 160L, 155L)), 
class = "data.frame", row.names = c("1", "2", "3"))

df使用
tidyr::complete
的一种方法是为每行创建一个从
date-6
date
的日期序列

library(dplyr)
library(tidyr)

df %>%
  mutate(Date = as.Date(Date)) %>%
  group_by(row = row_number()) %>%
  complete(Date = seq(Date - 6, Date, "day")) %>%
  ungroup %>%
  arrange(row, desc(Date)) %>%
  fill(Lat, lon)


# A tibble: 21 x 3
#   Date         Lat   on
#   <date>     <int> <int>
# 1 1996-03-12   -33   153
# 2 1996-03-11   -33   153
# 3 1996-03-10   -33   153
# 4 1996-03-09   -33   153
# 5 1996-03-08   -33   153
# 6 1996-03-07   -33   153
# 7 1996-03-06   -33   153
# 8 2004-07-15   -35   160
# 9 2004-07-14   -35   160
#10 2004-07-13   -35   160
# … with 11 more rows
库(dplyr)
图书馆(tidyr)
df%>%
变异(日期=as.Date(日期))%>%
分组依据(行=行编号())%>%
完成(日期=序号(日期-6,日期,“天”))%>%
解组%>%
排列(行,描述(日期))%>%
填充(横向、纵向)
#一个tibble:21x3
#星期日
#         
# 1 1996-03-12   -33   153
# 2 1996-03-11   -33   153
# 3 1996-03-10   -33   153
# 4 1996-03-09   -33   153
# 5 1996-03-08   -33   153
# 6 1996-03-07   -33   153
# 7 1996-03-06   -33   153
# 8 2004-07-15   -35   160
# 9 2004-07-14   -35   160
#10 2004-07-13   -35   160
#…还有11排
数据

df <- structure(list(Date = structure(1:3, .Label = c("1996-03-12", 
"2004-07-15", "2008-07-26"), class = "factor"), Lat = c(-33L, 
-35L, -28L), lon = c(153L, 160L, 155L)), 
class = "data.frame", row.names = c("1", "2", "3"))
dfBase R解决方案:

n_days_lookback <- 7

data.frame(do.call("rbind", lapply(split(df, df$Date), function(x){
    data.frame(Date = as.Date(seq(x$Date - n_days_lookback+1, x$Date, "days"), "%Y-%m-%d"), 
               Lat = rep(x$Lat, n_days_lookback),  
               lon = rep(x$lon, n_days_lookback))
      }
    )
  ), row.names = NULL
) 
n天回顾基本解决方案:

n_days_lookback <- 7

data.frame(do.call("rbind", lapply(split(df, df$Date), function(x){
    data.frame(Date = as.Date(seq(x$Date - n_days_lookback+1, x$Date, "days"), "%Y-%m-%d"), 
               Lat = rep(x$Lat, n_days_lookback),  
               lon = rep(x$lon, n_days_lookback))
      }
    )
  ), row.names = NULL
) 

n_days_lookback,而不是完全枚举日期间隔组合,查看具有日期间隔的lubridate包,或fuzzy_join。而不是完全枚举日期间隔组合,而是查看具有日期间隔的lubridate包,或fuzzy_join。谢谢@Ronak,这非常有效。我以前没有见过完整的函数或group_by(row=row_number())。它非常简单。注:``fill(Lat,on)``中的小错误应该是:``fill(Lat,lon)```谢谢@Ronak,这很好用。我以前没有见过完整的函数或group_by(row=row_number())。它非常简单。注:``fill(Lat,on)``中的小字体应该是:``` fill(Lat,lon)```