Вычисление ведущей переменной в мутации в R с датами

Я использую функцию mutate dplyr для создания столбца даты POSIX фрейма данных, взяв на себя инициативу другого столбца. Когда я пытаюсь заполнить недостающие значения в функции lead, используя одну дату, я получаю сообщение об ошибке:

> dates
# A tibble: 5 x 1
  orig_date          
  <dttm>             
1 2016-06-21 20:00:00
2 2016-07-09 22:00:00
3 2016-07-10 22:00:00
4 2016-07-20 21:00:00
5 2016-07-21 21:00:00

> fillin_date
[1] "2018-08-29 UTC"

> dates %>% mutate(next_date = lead(orig_date, 1, default = fillin_date))

Error in mutate_impl(.data, dots) : 
  Not compatible with requested type: [type=symbol; target=double].

Этого не происходит вне mutate:

> lead(dates$orig_date, 1, default = fillin_date)
[1] "2016-07-09 22:00:00 UTC" "2016-07-10 22:00:00 UTC" "2016-07-20 21:00:00 UTC"
[4] "2016-07-21 21:00:00 UTC" "2018-08-29 00:00:00 UTC"

Что здесь происходит не так?


person Julia Maddalena    schedule 03.10.2018    source источник
comment
Похоже, что аргумент default= должен быть значением и не может быть ссылкой на объект (символ) при использовании в конвейере dplyr. Если вы сделаете dates %>% mutate(next_date = lead(orig_date, 1, default = as.POSIXct("2018-08-29"))), это сработает. Это кажется мне ошибкой, но я посмотрю, сможет ли кто-нибудь найти лучшее решение. Даже выполнение dates %>% mutate(next_date = lead(orig_date, 1, default = (fillin_date))) заставляет его работать, потому что вызов оценивается. (или что-то типа того).   -  person thelatemail    schedule 04.10.2018
comment
Отправили проблему   -  person Calum You    schedule 04.10.2018


Ответы (1)


Я не уверен в основной причине, по которой вы можете указать символ вне mutate, но не внутри, но вы можете обойти это, заключая и не заключая переменную в кавычки. Вы также можете сохранить свою дату, чтобы заполнить ее как символ, и просто преобразовать ее в дату внутри вызова mutate.

library(tidyverse)
df <- tibble(orig_date = c("2016-06-21 20:00:00", "2016-07-09 22:00:00", "2016-07-10 22:00:00", "2016-07-20 21:00:00", "2016-07-21 21:00:00")) %>%
  mutate(orig_date = as.POSIXct(orig_date))

fillin_date <- as.POSIXct("2018-08-29")
fillin_date2 <- "2018-08-29"
df %>%
  mutate(next_date = lead(orig_date, 1, default = !!quo(fillin_date)))
#> # A tibble: 5 x 2
#>   orig_date           next_date          
#>   <dttm>              <dttm>             
#> 1 2016-06-21 20:00:00 2016-07-09 22:00:00
#> 2 2016-07-09 22:00:00 2016-07-10 22:00:00
#> 3 2016-07-10 22:00:00 2016-07-20 21:00:00
#> 4 2016-07-20 21:00:00 2016-07-21 21:00:00
#> 5 2016-07-21 21:00:00 2018-08-29 00:00:00
df %>%
  mutate(next_date = lead(orig_date, 1, default = as.POSIXct(fillin_date2)))
#> # A tibble: 5 x 2
#>   orig_date           next_date          
#>   <dttm>              <dttm>             
#> 1 2016-06-21 20:00:00 2016-07-09 22:00:00
#> 2 2016-07-09 22:00:00 2016-07-10 22:00:00
#> 3 2016-07-10 22:00:00 2016-07-20 21:00:00
#> 4 2016-07-20 21:00:00 2016-07-21 21:00:00
#> 5 2016-07-21 21:00:00 2018-08-29 00:00:00

Создано 3 октября 2018 г. с помощью пакета reprex (v0.2.0).

person Calum You    schedule 03.10.2018