Используйте Complete для создания плавающего окна дат - PullRequest
1 голос
/ 08 июля 2019

У меня есть набор данных, содержащий даты, когда птицы начали мигрировать.Я хотел бы добавить 7 строк в этот набор данных для каждого индивида, содержащего даты за 7 дней до их отъезда, со столбцом заполнения, содержащим другую переменную (0,1) для того, мигрировал ли индивид в эту дату.

Я пытался использовать функцию завершения dplyr, но не могу найти способ настроить ее так, чтобы минимальное и максимальное значения «плавали» в зависимости от даты миграции.

#migration dates for 10 individuals
date <- c(212, 224, 197, 210, 197, 224, 188, 212, 221, 198)
id <- c(1:10)
df <- data.frame(cbind(id, date))

#attempt to use complete function
df <- df %>% 
  mutate(depYN = 1) %>% 
  complete(date = date - seq(from = 7, to = 0),
           nesting(id),
           fill = list(depYN = 0))

Я получаю следующее предупреждающее сообщение с этим кодом:

Warning message:
In date - seq(from = 7, to = 0) :
  longer object length is not a multiple of shorter object length

Кроме того, он не дает результатов, которые я ищу, вместо этого depYN, кажется, случайным образом присваивает 1 и 0, а диапазоны датнеправильно.

(обновлено) Ожидаемый результат для первых двух лиц:

date   id   depYN
205    1    0
206    1    0
207    1    0
208    1    0
209    1    0
210    1    0
211    1    0
212    1    1
217    2    0
218    2    0
219    2    0
220    2    0
221    2    0
222    2    0
223    2    0
224    2    1
etc...

(обновлено) Текущий код и фактический набор данных

df1 <- lastDet %>% 
  mutate(doy = yday(depDate),
         depYN = 0) %>%
  select(-depDate)

df3 <- df1 %>% 
  group_by(mfgID) %>% 
  expand(doy = ((doy-7):doy)) %>% 
  left_join(., {df1 %>% mutate(depYN = 1)}, 
            by = c('mfgID', 'doy')) %>% 
  arrange(mfgID, doy)

dput(lastDet[1:10,])
structure(list(speciesEN = c("Bank", "Bank", "Bank", "Bank", "Bank",       
  "Bank", "Bank", "Bank", "Bank", "Bank"), tagDeploySite = 
  structure(c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 5L, 5L), .Label =       
  c("AU", "CB", "DE", "GA", "TR", "WE"), class = "factor"), sex = 
  structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 1L, 1L), .Label = c("F", 
  "M"), class = "factor"), mfgID = c("46", "47", "48", "49", "40",             
  "41", "42", "44", "38", "50"), depDate = 
  structure(c(1533032604.2326, 1534086023.11, 1531737149.7107, 
  1532882823.5637, 1531737145.3837, 1534093849.7991, 1530997725.9412, 
  1533041446.3001, 1533820579.7317, 1531824345.5634), class = 
  c("POSIXct", "POSIXt"), tzone = "UTC")), row.names = c(NA, -10L),       
  class = c("grouped_df", "tbl_df", "tbl", "data.frame"), vars = 
  c("speciesEN",  "tagDeploySite", "sex"), drop = TRUE, indices = 
  list(0:3, 4:7, 8:9), group_sizes = c(4L, 4L, 2L), biggest_group_size 
  = 4L, labels = structure(list(speciesEN = c("Bank", "Bank", "Bank"), 
  tagDeploySite = structure(c(2L, 2L, 5L), .Label = c("AU", "CB", 
  "DE", "GA", "TR", "WE"), class = "factor"), sex = structure(c(1L, 
  2L, 1L), .Label = c("F",     "M"), class = "factor")), row.names = 
  c(NA, -3L), class = "data.frame", vars = c("speciesEN", 
  "tagDeploySite", "sex"), drop = TRUE))

Ответы [ 2 ]

2 голосов
/ 09 июля 2019

Вы также можете использовать complete, как и в своем вопросе

df %>%
    mutate(depYN = 1) %>%
    group_by(id) %>%
        complete(date = ((date-7):date), 
                 nesting(id),
                 fill = list(depYN = 0))

# A tibble: 80 x 3
# Groups:   id [10]
      id  date depYN
   <dbl> <dbl> <dbl>
 1     1   205     0
 2     1   206     0
 3     1   207     0
 4     1   208     0
 5     1   209     0
 6     1   210     0
 7     1   211     0
 8     1   212     1
 9     2   217     0
10     2   218     0
# ... with 70 more rows
1 голос
/ 08 июля 2019

Мы можем expand на (date-7):date) и join с исходным набором данных, чтобы получить depYN.

library(dplyr)
library(tidyr)

df %>% 
  group_by(id) %>% 
  expand(date=((date-7):date)) %>% 
  left_join(., {df %>% mutate(depYN = 1)}, by = c('id','date'))
#> # A tibble: 80 x 3
#> # Groups:   id [10]
#>       id  date depYN
#>    <dbl> <dbl> <dbl>
#>  1     1   205    NA
#>  2     1   206    NA
#>  3     1   207    NA
#>  4     1   208    NA
#>  5     1   209    NA
#>  6     1   210    NA
#>  7     1   211    NA
#>  8     1   212     1
#>  9     2   217    NA
#> 10     2   218    NA
#> # ... with 70 more rows
...