1

我正在尝试创建一个接收数据框并创建其他滞后和滚动窗口特征(例如移动平均线)的过程。这就是我到目前为止所拥有的。

# dummy dataframe
n <- 20
set.seed(123)
foo <- data.frame(
  date = seq(as.Date('2020-01-01'),length.out = n, by = 'day'),
  var1 = sample.int(n),
  var2 = sample.int(n))

# creates lags and based on (some of) them creates rolling average features
foo %>% 
  mutate_at(vars(starts_with('var')),
            funs(lag_1 = lag(.), lag_2 = lag(.,2))) %>% 
  mutate_at(vars(contains('lag_1')),
            funs(ra_3 = rollmean(., k = 3, align = 'right', fill = NA)))

上面的块:

  1. 考虑所选变量创建 lag01,lag02 特征
  2. 基于新创建列的子集,创建滚动平均特征

我现在正在寻找的是创建任意数量的滞后特征(例如 lag3、lag6、lag9 等)以及创建任意数量的滚动平均特征(具有不同的窗口长度 - 即 var1_lag_1_ra_3、var1_lag_1_ra_6、var2_lag_1_ra_3、 var2_lag_1_ra_6。目前生成此类特征的设置是硬编码的。理想情况下,我会有几个向量来调整结果;像这样:

lag_features <- c(3,6,9)
ma_features <- c(12,15)

最后,如果有一种方法可以动态地配置生成的特征的名称,那就太好了。我见过{{}}, !!,:=运算符,但我并不能真正区分它们或如何使用它们。

我还使用 timetk 包中的一些现成的功能实现了上述功能,但由于我正在寻找一些额外的灵活性,我想知道如何自己复制这种行为。

library(timetk)
foo %>% 
  select(date,starts_with('var')) %>%
  tk_augment_lags(.value = starts_with("var"),
                  .lags = 1) %>% 
  tk_augment_slidify(.value   = ends_with("lag1"),
                     .period  = seq(0,24,3)[-1],
                     .f       = mean,
                     .align   = 'right', 
                     .partial = TRUE
  )

任何支持将不胜感激。

4

1 回答 1

1

您可以使用该map函数获取变量数的滞后值。我们可以使用.names参数 inacross为新列提供名称。

library(dplyr)
library(purrr)
library(zoo)

lag_features <- c(3,6,9)
ma_features <- c(12,15)

foo <- bind_cols(foo, map_dfc(lag_features, ~foo %>% 
                         transmute(across(starts_with('var'), 
                                          lag, .x, .names = '{col}_lag{.x}'))),
                map_dfc(ma_features, ~foo %>%
                        transmute(across(contains('lag3'), rollmeanr, k = .x, 
                             fill = NA, .names = '{col}_{.x}'))))
于 2021-10-20T04:02:01.740 回答