【问题标题】:Calculating lead variable within mutate in R with dates用日期计算R中变异内的前导变量
【发布时间】:2018-10-03 22:09:59
【问题描述】:

我正在使用 dplyr 的 mutate 函数通过引领另一列来创建数据框的 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"

这里出了什么问题?

【问题讨论】:

  • 看起来default= 参数在 dplyr 管道中使用时必须是一个值,并且不能是对对象(符号)的引用。如果你这样做 dates %&gt;% mutate(next_date = lead(orig_date, 1, default = as.POSIXct("2018-08-29"))) 它似乎工作。这让我觉得是一个错误,但我会看看是否有人能找到更好的解决方案。即使做dates %&gt;% mutate(next_date = lead(orig_date, 1, default = (fillin_date))) 也可以让它工作,因为调用会被评估。 (或类似的东西)。
  • 提交了issue

标签: r dplyr lead


【解决方案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

reprex package (v0.2.0) 于 2018 年 10 月 3 日创建。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 2021-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多