Есть ли лучший способ получить несколько переменных, используя функцию NESTING для ЗАВЕРШЕНИЯ фрейма данных? - PullRequest
0 голосов
/ 29 января 2019

Я пытаюсь complete фрейм данных для нескольких категориальных переменных и, следовательно, создать согласованный объект временного ряда для каждой комбинации категориальных переменных , присутствующих в данных , используя функцию nesting.

Вот пример кадра данных -

> dput(df)
structure(list(ds = structure(c(1546300800, 1546387200, 1546473600, 
1546560000), class = c("POSIXct", "POSIXt"), tzone = "UTC"), 
    y = c(40, 40, 40, 40), type = c("a", "a", "a", "b"), city = c("x", 
    "x", "x", "y"), hid = c(1, 2, 2, 3)), row.names = c(NA, -4L
), na.action = structure(c(`5` = 5L), class = "omit"), class = c("tbl_df", 
"tbl", "data.frame"))

# Find the date range
min_date <- min(df$ds)
max_date <- max(df$ds)
dates_seq <- seq.POSIXt(from = min_date, 
                        to = max_date, 
                        by = '1 day')

Вот то, что я пытался, и это дает ожидаемые результаты -

df %>%
    complete(nesting(type, city, hid), 
             ds = dates_seq, 
             fill = list(y = 0))

# A tibble: 12 x 5
#   type  city    hid ds                      y
#   <chr> <chr> <dbl> <dttm>              <dbl>
# 1 a     x         1 2019-01-01 00:00:00    40
# 2 a     x         1 2019-01-02 00:00:00     0
# 3 a     x         1 2019-01-03 00:00:00     0
# 4 a     x         1 2019-01-04 00:00:00     0
# 5 a     x         2 2019-01-01 00:00:00     0
# 6 a     x         2 2019-01-02 00:00:00    40
# 7 a     x         2 2019-01-03 00:00:00    40
# 8 a     x         2 2019-01-04 00:00:00     0
# 9 b     y         3 2019-01-01 00:00:00     0
#10 b     y         3 2019-01-02 00:00:00     0
#11 b     y         3 2019-01-03 00:00:00     0
#12 b     y         3 2019-01-04 00:00:00    40

Если я не знаю явно, какиекатегориальные переменные в df как передать эти столбцы в nesting?Я предполагаю, что все экземпляры df содержат как минимум оба столбца ds, y.


EDIT: Я также попробовал следующее, которое выдает ошибку -

complete(df, 
    nesting(names(df)[!(names(df) %in% c("ds", "y"))]), 
    ds = dates_seq, 
    fill = list(y = 0))

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Вот еще один способ решить эту проблему с помощью оператора !!! -

df %>%
    complete(nesting(!!!select(df, -ds, -y)), 
             ds = dates_seq, 
             fill = list(y = 0))
0 голосов
/ 29 января 2019

Мы можем использовать пакет rlang.Используйте syms (поскольку имеется несколько столбцов) для names(df)[!names(df) %in% c("ds", "y")] и сохраняйте в переменной, а затем используйте !!! внутри функции nesting.

library(tidyverse)
library(rlang)

ne <- syms(names(df)[!names(df) %in% c("ds", "y")])

df %>%
  complete(nesting(!!!ne), 
           ds = dates_seq, 
           fill = list(y = 0))
# # A tibble: 12 x 5
#    type  city    hid ds                      y
#    <chr> <chr> <dbl> <dttm>              <dbl>
#  1 a     x         1 2019-01-01 00:00:00    40
#  2 a     x         1 2019-01-02 00:00:00     0
#  3 a     x         1 2019-01-03 00:00:00     0
#  4 a     x         1 2019-01-04 00:00:00     0
#  5 a     x         2 2019-01-01 00:00:00     0
#  6 a     x         2 2019-01-02 00:00:00    40
#  7 a     x         2 2019-01-03 00:00:00    40
#  8 a     x         2 2019-01-04 00:00:00     0
#  9 b     y         3 2019-01-01 00:00:00     0
# 10 b     y         3 2019-01-02 00:00:00     0
# 11 b     y         3 2019-01-03 00:00:00     0
# 12 b     y         3 2019-01-04 00:00:00    40
...