/R/tidyr-verbs.R

https://github.com/tidyverts/tsibble · R · 195 lines · 164 code · 20 blank · 11 comment · 19 complexity · 220b0da1a27f0cc36428ce4e4f389098 MD5 · raw file

  1. globalVariables(c("name"))
  2. pivot_longer.tbl_ts <- function(data, cols, names_to = "name", ...) {
  3. if (!has_length(names_to)) {
  4. abort("`pivot_longer(<tsibble>)` can't accept zero-length `names_to`.")
  5. }
  6. if (".value" %in% names_to) {
  7. abort("`pivot_longer(<tsibble>)` can't accept the special \".value\" in `names_to`.")
  8. }
  9. new_key <- c(key_vars(data), names_to)
  10. vars <- names(eval_select(enquo(cols), data))
  11. data <- mutate_index2(data, vars)
  12. tbl <- tidyr::pivot_longer(as_tibble(data),
  13. cols = !!enquo(cols), names_to = names_to, ...)
  14. build_tsibble(tbl,
  15. key = !!new_key, index = !!index(data), index2 = !!index2(data),
  16. ordered = is_ordered(data), interval = interval(data), validate = FALSE
  17. )
  18. }
  19. pivot_wider.tbl_ts <- function(data, id_cols = NULL, names_from = name, ...) {
  20. key_var <- vars_pull(names(data), !!enquo(names_from))
  21. if (has_index(key_var, data)) {
  22. abort(c(
  23. sprintf("Column `%s` (index) can't be widened.", key_var),
  24. i = "Please use `as_tibble()` to coerce."
  25. ))
  26. }
  27. key_left <- setdiff(key_vars(data), key_var)
  28. new_key <- key_vars(remove_key(data, .vars = key_left))
  29. tbl <- tidyr::pivot_wider(as_tibble(data),
  30. id_cols = !!enquo(id_cols), names_from = !!enquo(names_from), ...)
  31. tbl <- retain_tsibble(tbl, new_key, index(data))
  32. vars <- names(tbl)
  33. data <- mutate_index2(data, vars)
  34. build_tsibble(
  35. tbl,
  36. key = !!new_key, index = !!index(data), index2 = !!index2(data),
  37. ordered = is_ordered(data), interval = is_regular(data),
  38. validate = FALSE
  39. )
  40. }
  41. gather.tbl_ts <- function(data, key = "key", value = "value", ...,
  42. na.rm = FALSE, convert = FALSE, factor_key = FALSE) {
  43. key <- as_string(enexpr(key))
  44. new_key <- c(key_vars(data), key)
  45. value <- enexpr(value)
  46. exprs <- enexprs(...)
  47. if (is_empty(exprs)) {
  48. exprs <- setdiff(
  49. names(data),
  50. c(quo_name(key), quo_name(value), quo_name(index(data)))
  51. )
  52. }
  53. vars <- names(eval_select(expr(c(...)), data))
  54. data <- mutate_index2(data, vars)
  55. tbl <- tidyr::gather(
  56. as_tibble(data),
  57. key = !!key, value = !!value, !!!exprs,
  58. na.rm = na.rm, convert = convert, factor_key = factor_key
  59. )
  60. build_tsibble(tbl,
  61. key = !!new_key, index = !!index(data), index2 = !!index2(data),
  62. ordered = is_ordered(data), interval = interval(data), validate = FALSE
  63. )
  64. }
  65. spread.tbl_ts <- function(data, key, value, ...) {
  66. key <- enexpr(key)
  67. value <- enexpr(value)
  68. key_var <- vars_pull(names(data), !!key)
  69. if (has_index(key_var, data)) {
  70. abort(c(
  71. sprintf("Column `%s` (index) can't be spread.", key_var),
  72. i = "Please use `as_tibble()` to coerce."
  73. ))
  74. }
  75. key_left <- setdiff(key_vars(data), key_var)
  76. new_key <- key_vars(remove_key(data, .vars = key_left))
  77. tbl <- tidyr::spread(as_tibble(data), key = !!key, value = !!value, ...)
  78. tbl <- retain_tsibble(tbl, new_key, index(data))
  79. vars <- names(tbl)
  80. data <- mutate_index2(data, vars)
  81. build_tsibble(
  82. tbl,
  83. key = !!new_key, index = !!index(data), index2 = !!index2(data),
  84. ordered = is_ordered(data), interval = is_regular(data),
  85. validate = FALSE
  86. )
  87. }
  88. nest.tbl_ts <- function(.data, ...) {
  89. data <- .data
  90. tbl_nest <- tidyr::nest(as_tibble(data), ...)
  91. data_names <- names(data)
  92. nest_names <- names(tbl_nest)
  93. nest_vars <- setdiff(data_names, nest_names)
  94. if (!has_all_key(nest_vars, data) && !has_index(nest_vars, data)) {
  95. build_tsibble(tbl_nest,
  96. key = setdiff(key_vars(data), nest_vars),
  97. index = !!index(data), validate = FALSE
  98. )
  99. } else if (!has_index(nest_vars, data)) {
  100. build_tsibble(tbl_nest, index = !!index(data), validate = FALSE)
  101. } else {
  102. new_lst <- nest_names[map_lgl(tbl_nest, is_list)]
  103. old_lst <- data_names[map_lgl(data, is_list)]
  104. lst_vars <- setdiff(new_lst, old_lst)
  105. data <- remove_key(ungroup(data), nest_vars)
  106. tbl_nest[[lst_vars]] <- lapply(tbl_nest[[lst_vars]],
  107. function(x) update_meta(x, data))
  108. tbl_nest
  109. }
  110. }
  111. nest.grouped_ts <- nest.tbl_ts
  112. unnest.tbl_ts <- function(data, ...) {
  113. data <- as_tibble(data)
  114. NextMethod()
  115. }
  116. #' Unnest a data frame consisting of tsibbles to a tsibble
  117. #'
  118. #' @description
  119. #' \lifecycle{deprecated}
  120. #'
  121. #' @param data A data frame contains homogenous tsibbles in the list-columns.
  122. #' @param cols Names of columns to unnest.
  123. #' @inheritParams as_tsibble
  124. #' @keywords internal
  125. #' @export
  126. unnest_tsibble <- function(data, cols, key = NULL, validate = TRUE) {
  127. if (!is_installed("tidyr") && utils::packageVersion("tidyr") >= "0.9.0") {
  128. abort("Package 'tidyr' (>= v1.0.0) required for `unnest_tsibble()`.")
  129. }
  130. cols <- enquo(cols)
  131. if (quo_is_missing(cols)) {
  132. abort("Argument `cols` for columns to unnest is required.")
  133. }
  134. unnested_data <- tidyr::unnest(as_tibble(data), cols = !!cols)
  135. if (is_tsibble(data)) {
  136. idx <- index(data)
  137. tsbl <- data
  138. } else {
  139. data_names <- names(data)
  140. unnested_names <- names(unnested_data)
  141. new_lst <- unnested_names[map_lgl(unnested_data, is_list)]
  142. old_lst <- data_names[map_lgl(data, is_list)]
  143. lst_cols <- setdiff(old_lst, new_lst)
  144. # checking if the nested columns has `tbl_ts` class
  145. tsbl_col <- map_lgl(data[lst_cols], validate_list_of_tsibble)
  146. if (sum(tsbl_col) == 0) {
  147. abort("Unnested columns contain no tsibble columns.")
  148. }
  149. first_nested <- data[lst_cols][1L, ]
  150. eval_col <- map(first_nested, first)
  151. tsbl <- eval_col[tsbl_col][[1L]]
  152. idx <- index(tsbl)
  153. }
  154. key <- names(eval_select(enquo(key), data = unnested_data))
  155. idx_chr <- as_string(idx)
  156. class(unnested_data[[idx_chr]]) <- class(tsbl[[idx_chr]])
  157. build_tsibble(
  158. unnested_data,
  159. key = !!key, index = !!idx, index2 = !!index2(tsbl),
  160. ordered = is_ordered(tsbl), interval = is_regular(tsbl), validate = validate
  161. )
  162. }
  163. validate_list_of_tsibble <- function(x) {
  164. all(vapply(x, function(x) is_tsibble(x), logical(1)))
  165. }
  166. fill.tbl_ts <- function(data, ..., .direction = c("down", "up")) {
  167. res <- NextMethod()
  168. update_meta2(res, data, ordered = is_ordered(data), interval = interval(data))
  169. }
  170. fill.grouped_ts <- fill.tbl_ts
  171. drop_na.tbl_ts <- function(data, ...) {
  172. res <- NextMethod()
  173. update_meta2(res, data, ordered = is_ordered(data), interval = interval(data))
  174. }
  175. drop_na.grouped_ts <- drop_na.tbl_ts