使用dplyr和for循环添加多个滞后变量

使用dplyr和for循环添加多个滞后变量,r,dplyr,R,Dplyr,我有我预测的时间序列数据,所以我创建了滞后变量,用于我的统计分析。我想要一个快速的方法来创建多个给定特定输入的变量,这样我就可以轻松地交叉验证和比较模型 以下示例代码为给定类别(a、B、C)的2个不同变量(共4个)添加了2个滞后: 老实说,我只是有点不知道如何让它发挥作用。我的for循环和整体逻辑的顺序是有意义的,但函数将字符转换为变量的方式和整体语法似乎有点不对劲。有没有一个简单的方法来修复这个函数以获得我想要的结果 特别是,我正在寻找: 类似于MultiMutate(data=data,va

我有我预测的时间序列数据,所以我创建了滞后变量,用于我的统计分析。我想要一个快速的方法来创建多个给定特定输入的变量,这样我就可以轻松地交叉验证和比较模型

以下示例代码为给定类别(a、B、C)的2个不同变量(共4个)添加了2个滞后:

老实说,我只是有点不知道如何让它发挥作用。我的for循环和整体逻辑的顺序是有意义的,但函数将字符转换为变量的方式和整体语法似乎有点不对劲。有没有一个简单的方法来修复这个函数以获得我想要的结果

特别是,我正在寻找:

  • 类似于
    MultiMutate(data=data,variables=c(values1,values2),lags=2)的函数
    ,它将从上面创建
    LagVal
    的精确结果

  • 基于变量及其滞后动态命名变量。即值1.1、值1.2、值2.1、值2.2等


  • 提前感谢您,如果您需要更多信息,请告诉我。如果有更简单的方法得到我想要的东西,那么我会洗耳恭听

    您必须深入到tidyverse工具箱中,才能一次添加它们。如果为
    cats
    的每个值嵌套数据,则可以在嵌套的数据帧上迭代,在每个数据帧中的
    值*
    列上迭代滞后

    库(tidyverse)
    种子(47)
    df%嵌套(-cats)%%>%
    突变(滞后=映射(数据、函数(dat)){
    imap_dfc(dat[-1],~set_名称(map(1:2,滞后,x=.x)),
    粘贴0(.y,_滞后,1:2)))
    })) %>% 
    unest()%>%
    安排(天)
    #>#tibble:9 x 8
    #>猫日值1值2值1\u lag1值1\u lag2值2\u lag1
    #>                                  
    #>1234-7.娜娜娜
    #>2B219。1.娜娜娜
    #>3 C 3 17。17娜娜娜
    #>4 A 4 15。2424NA-7。
    #>5 B 5 16-1319NA 1。
    #>6 C 6 12。1717NA 17。
    #>7 A 7 12。27152424
    #>8 B 8 16。151619.         -13
    #>9 C 9 15。36121717
    #> # ... 还有1个变量:值2\u lag2
    
    data.table::shift
    将其矢量化,使其更简单。命名比实际滞后需要更多的工作:

    库(data.table)
    setDT(df)
    df[,sapply(1:2,函数(x){paste0('values',x','u lag',1:2)}):=shift(.SD,1:2),
    by=cats,.SDcols=values1:values2][]
    #>天数CAT值1值2值1\u lag1值1\u lag2值2\u lag1
    #>1:1A 24-7NA NA
    #>2:2b191na-NA-NA
    #>3:3 C 17 NA NA NA
    #>4:4 A 15 24 NA-7
    #>5:5B16-1319NA 1
    #>6:6C1217 NA 17
    #>7:7 A 12 27 15 24
    #>8:8B161619-13
    #>9:9C15361717
    #>值2_lag2
    #>1:NA
    #>2:NA
    #>3:NA
    #>4:NA
    #>5:NA
    #>6:NA
    #> 7:           -7
    #> 8:            1
    #> 9:           17
    
    在这些情况下,我依靠
    dplyr
    tidyr
    的魔力:

    library(dplyr)
    library(tidyr)
    
    set.seed(47)
    
    # create data
    s_data = data_frame(
      days = 1:9,
      cats = rep(c('A', 'B', 'C'), 3),
      values1 = round(rnorm(9, 16, 4)),
      values2 = round(rnorm(9, 16, 16))
    )
    
    max_lag = 2 # define max number of lags
    
    # create lags
    s_data %>% 
      gather(select = -c("days", "cats")) %>% # gather all variables that will be lagged
      mutate(n_lag = list(0:max_lag)) %>% # add list-column with lag numbers
      unnest() %>% # unnest the list column
      arrange(cats, key, n_lag, days) %>% # order the data.frame
      group_by(cats, key, n_lag) %>% # group by relevant variables
      # create lag. when grouped by vars above, n_lag is a constant vector, take 1st value
      mutate(lag_val = lag(value, n_lag[1])) %>% 
      ungroup() %>% 
      # create some fancy labels 
      mutate(var_name = ifelse(n_lag == 0, key, paste0("Lag", key, ".", n_lag))) %>% 
      select(-c(key, value, n_lag)) %>% # drop unnecesary data
      spread(var_name, lag_val) %>% # spread your newly created variables
      select(days, cats, starts_with("val"), starts_with("Lag")) # reorder
    
    ## # A tibble: 9 x 8
    ##    days cats  values1 values2 Lagvalues1.1 Lagvalues1.2 Lagvalues2.1 Lagvalues2.2
    ##   <int> <chr>   <dbl>   <dbl>        <dbl>        <dbl>        <dbl>        <dbl>
    ## 1     1 A         24.     -7.          NA           NA           NA           NA 
    ## 2     2 B         19.      1.          NA           NA           NA           NA 
    ## 3     3 C         17.     17.          NA           NA           NA           NA 
    ## 4     4 A         15.     24.          24.          NA           -7.          NA 
    ## 5     5 B         16.    -13.          19.          NA            1.          NA 
    ## 6     6 C         12.     17.          17.          NA           17.          NA 
    ## 7     7 A         12.     27.          15.          24.          24.          -7.
    ## 8     8 B         16.     15.          16.          19.         -13.           1.
    ## 9     9 C         15.     36.          12.          17.          17.          17.
    
    库(dplyr)
    图书馆(tidyr)
    种子(47)
    #创建数据
    s_数据=数据_帧(
    天数=1:9,
    猫=代表(c('A','B','c'),3),
    值1=四舍五入(rnorm(9,16,4)),
    值2=四舍五入(rnorm(9,16,16))
    )
    最大滞后=2#定义最大滞后数
    #造成滞后
    s_数据%>%
    收集(选择=-c(“天”、“猫”))%>%#收集所有将滞后的变量
    mutate(n_lag=list(0:max_lag))%>%#添加带有滞后编号的列表列
    unest()%>%#取消列表列的测试
    安排(猫、键、n_滞后、天数)%>%#对数据框进行排序
    分组依据(猫、键、n_滞后)%>%#分组依据相关变量
    #造成滞后。当按上述变量分组时,n_lag是一个常量向量,取第一个值
    突变(滞后值=滞后(值,n滞后[1]))%>%
    解组()%>%
    #创建一些奇特的标签
    变异(var_name=ifelse(n_lag==0,key,paste0(“lag”,key,“.”,n_lag)))%>%
    选择(-c(键、值、n#lag))%>%#删除不必要的数据
    排列(变量名,滞后值)%>%#排列新创建的变量
    选择(天、猫、以(“val”)开头、以(“滞后”)开头)、重新排序
    ###tibble:9 x 8
    ##天数CAT值1值2滞后值1.1滞后值1.2滞后值2.1滞后值2.2
    ##                                          
    ##1 A 24-7.娜娜娜娜
    ##2 B 19。1.娜娜娜娜
    ##3 C 17。17娜娜娜娜
    ##4 A 15。2424NA-7。NA
    ##5 B 16-1319NA 1。NA
    ##6 C 12。1717NA 17。NA
    ##7 A 12。27152424.          -7.
    ##8 B 16。151619.         -131.
    ##9 C 15。3612171717
    
    hey@alistaire太好了。但是你介意解释一下你在这里做了什么疯狂的魔法吗_
    MultiMutate = function(data, variables, lags){
      # select the data to be working with
      FuncData = data
      # Loop through desired variables to mutate
      for (i in variables){
        # Loop through number of desired lags
        for (u in 1:lags){
          FuncData = FuncData %>% arrange(days) %>% group_by(cats) %>%
            # Mutate new variable for desired number of lags. Give new variable a name with the lag number appended
            mutate(paste(i, u) = lag(i, u))
        }
      }
      FuncData
    }
    
    library(dplyr)
    library(tidyr)
    
    set.seed(47)
    
    # create data
    s_data = data_frame(
      days = 1:9,
      cats = rep(c('A', 'B', 'C'), 3),
      values1 = round(rnorm(9, 16, 4)),
      values2 = round(rnorm(9, 16, 16))
    )
    
    max_lag = 2 # define max number of lags
    
    # create lags
    s_data %>% 
      gather(select = -c("days", "cats")) %>% # gather all variables that will be lagged
      mutate(n_lag = list(0:max_lag)) %>% # add list-column with lag numbers
      unnest() %>% # unnest the list column
      arrange(cats, key, n_lag, days) %>% # order the data.frame
      group_by(cats, key, n_lag) %>% # group by relevant variables
      # create lag. when grouped by vars above, n_lag is a constant vector, take 1st value
      mutate(lag_val = lag(value, n_lag[1])) %>% 
      ungroup() %>% 
      # create some fancy labels 
      mutate(var_name = ifelse(n_lag == 0, key, paste0("Lag", key, ".", n_lag))) %>% 
      select(-c(key, value, n_lag)) %>% # drop unnecesary data
      spread(var_name, lag_val) %>% # spread your newly created variables
      select(days, cats, starts_with("val"), starts_with("Lag")) # reorder
    
    ## # A tibble: 9 x 8
    ##    days cats  values1 values2 Lagvalues1.1 Lagvalues1.2 Lagvalues2.1 Lagvalues2.2
    ##   <int> <chr>   <dbl>   <dbl>        <dbl>        <dbl>        <dbl>        <dbl>
    ## 1     1 A         24.     -7.          NA           NA           NA           NA 
    ## 2     2 B         19.      1.          NA           NA           NA           NA 
    ## 3     3 C         17.     17.          NA           NA           NA           NA 
    ## 4     4 A         15.     24.          24.          NA           -7.          NA 
    ## 5     5 B         16.    -13.          19.          NA            1.          NA 
    ## 6     6 C         12.     17.          17.          NA           17.          NA 
    ## 7     7 A         12.     27.          15.          24.          24.          -7.
    ## 8     8 B         16.     15.          16.          19.         -13.           1.
    ## 9     9 C         15.     36.          12.          17.          17.          17.