为什么我不能在 tsibble 上使用 drop_na?

Why can't I use drop_na on a tsibble?

MRE:

library(tsibble)
#> Warning in system("timedatectl", intern = TRUE): running command 'timedatectl'
#> had status 1
library(tidyr)

my_tsibble <- structure(list(date = structure(c(18388, 18389, 18390, 18391, 
                                             18392, 18393), class = "Date"), new_cases = c(1444, 1401, 1327, 
                                                                                           1083, 802, NA)), row.names = c(NA, -6L), key = structure(list(
                                                                                             .rows = list(1:6)), row.names = c(NA, -1L), class = c("tbl_df", 
                                                                                                                                                   "tbl", "data.frame")), index = structure("date", ordered = TRUE), index2 = "date", interval = structure(list(
                                                                                                                                                     year = 0, quarter = 0, month = 0, week = 0, day = 1, hour = 0, 
                                                                                                                                                     minute = 0, second = 0, millisecond = 0, microsecond = 0, 
                                                                                                                                                     nanosecond = 0, unit = 0), class = "interval"), class = c("tbl_ts", 
                                                                                                                                                                                                               "tbl_df", "tbl", "data.frame"))
drop_na(my_tsibble)
#> # A tibble: 5 x 2
#>   date       new_cases
#>   <date>         <dbl>
#> 1 2020-05-06      1444
#> 2 2020-05-07      1401
#> 3 2020-05-08      1327
#> 4 2020-05-09      1083
#> 5 2020-05-10       802

换句话说,从 tsibble 开始,使用 drop_na 删除最后一行,我得到了 tibble。这很烦人,因为为了在 fable 中应用预测方法,我需要 my_tsibble 成为 tsibble。如何在不丢失 tsibble 类型的情况下删除 NA 值?

你的问题的答案是你可以tsibble上使用drop_na;只是结果 object 在此过程中被强制转换为 tibble 。这样做的原因是 drop_natidyr 包中的通用函数。没有在任何地方指定以不同方式处理 tsibble 的方法。因此 drop_na 只输出小标题或数据帧。另一种看待它的方式是,drop_na 从未听说过 tsibble,但它知道它继承自 tibble,并这样对待它。

但是,您可以定义一个新的 S3 方法,drop_na.tbl_ts 来为您完成这项工作:

drop_na.tbl_ts <- function(ts) tsibble::as_tsibble(tidyr:::drop_na.data.frame(ts))

所以现在 drop_na 按预期工作:

drop_na(my_tsibble)
#> Using `date` as index variable.
#> # A tsibble: 5 x 2 [1D]
#>   date       new_cases
#>   <date>         <dbl>
#> 1 2020-05-06      1444
#> 2 2020-05-07      1401
#> 3 2020-05-08      1327
#> 4 2020-05-09      1083
#> 5 2020-05-10       802