R манипулирует фреймом данных дат, чтобы включить 7 дней до каждой даты - PullRequest
1 голос
/ 09 апреля 2020

В настоящее время у меня есть дата, широта и долгота, которые представляют взятые образцы. Простой пример ниже:

        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

Ответы [ 2 ]

2 голосов
/ 09 апреля 2020

Один из способов сделать это с помощью 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

data

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"))
1 голос
/ 09 апреля 2020

Базовый раствор 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
) 
...