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)```