为什么我不能在 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_na
是 tidyr
包中的通用函数。没有在任何地方指定以不同方式处理 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
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_na
是 tidyr
包中的通用函数。没有在任何地方指定以不同方式处理 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