【问题标题】:R manipulate dataframe of dates to include 7 days prior to each dateR操纵日期的数据框以包括每个日期之前的7天
【发布时间】:2020-04-09 00:45:15
【问题描述】:

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

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

我想生成一个表格,在每个日期/纬度/经度组合之前添加 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

【问题讨论】:

  • 与其完全枚举 date-lat-long 组合,不如查看带有日期间隔或 blur_join 的 lubridate 包。

标签: r date data-manipulation


【解决方案1】:

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

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

数据

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

【讨论】:

  • 谢谢@Ronak,这很好用。我以前没有遇到过完整的函数或 group_by(row = row_number()) 。这非常简单。 PS。 ``` fill(Lat, on) ``` 中的小错字应该是: ``` fill(Lat, lon) ```
【解决方案2】:

基础 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
) 

【讨论】:

    猜你喜欢
    • 2014-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    相关资源
    最近更新 更多