代码之家  ›  专栏  ›  技术社区  ›  Luis Carmona Martinez

循环数据中的所有变量。创建n个LAG的表格

  •  0
  • Luis Carmona Martinez  · 技术社区  · 6 年前

    我有一个数据。表中有200个OB和20个变量,我需要从循环中的这20个变量中得到n-LAG。

    我尝试了下面的方法,但没有正常工作。

    有什么帮助吗?

    nombresvar=名称(Model\u X)

    for(j in nombresvar)for(i in 1:3)

    Model\u X[,c(paste0(j,i)):=滞后(c(paste0('Model\u X$',j)),i)]

    问题来自 滞后函数 ,因为我的代码似乎工作不正常,当试图每个变量生成4个滞后变量时,名称在Nombresvar向量中。

    每个循环的滞后函数应如下所示:

    lag ( ModelX$Variable1, 1)
    lag ( ModelX$Variable1, 2)
    lag ( ModelX$Variable1, 3)
    lag ( ModelX$Variable2, 1)
    ....
    lag ( ModelX$VariableN, 3)
    
    3 回复  |  直到 6 年前
        1
  •  1
  •   Uwe    6 年前

    有一种更简单的方法来创建额外的滞后列。这个 n 参数到 data-table shift() 函数定义为

    非负整数向量,表示超前或滞后于 输入人。要创建多个超前/滞后向量,请提供多个值 至n

    所以

    DT[, shift(baz, 0:3)]
    

    退货

        V1 V2 V3 V4
     1:  3 NA NA NA
     2:  6  3 NA NA
     3:  9  6  3 NA
     4: 12  9  6  3
     5: 15 12  9  6
     6: 18 15 12  9
     7: 21 18 15 12
     8: 24 21 18 15
     9: 27 24 21 18
    10: 30 27 24 21
    

    现在,OP请求对每个变量进行移位,并根据移位量命名新列。这可以通过以下方式实现

    DT[, unlist(lapply(.SD, shift, n = 0:3), recursive = FALSE)]
    
        foo1 foo2 foo3 foo4 bar1 bar2 bar3 bar4 baz1 baz2 baz3 baz4
     1:    1   NA   NA   NA    2   NA   NA   NA    3   NA   NA   NA
     2:    2    1   NA   NA    4    2   NA   NA    6    3   NA   NA
     3:    3    2    1   NA    6    4    2   NA    9    6    3   NA
     4:    4    3    2    1    8    6    4    2   12    9    6    3
     5:    5    4    3    2   10    8    6    4   15   12    9    6
     6:    6    5    4    3   12   10    8    6   18   15   12    9
     7:    7    6    5    4   14   12   10    8   21   18   15   12
     8:    8    7    6    5   16   14   12   10   24   21   18   15
     9:    9    8    7    6   18   16   14   12   27   24   21   18
    10:   10    9    8    7   20   18   16   14   30   27   24   21
    

    数据

    为了进行比较,以下样本数据 Matt's answer 已使用

    library(data.table)
    DT <- data.table(foo = seq_len(10),
                     bar = seq_len(10)*2L,
                     baz = seq_len(10)*3L)
    
        2
  •  0
  •   Andrew Bannerman    6 年前

    不确定这是否是您的问题:

    # Random data 200 obs, 20 vars 
    set.seed(1)
    df <- data.frame(replicate(20,sample(0:100,200,rep=TRUE)))
    
    # fucntion for getting lags
    lags <- function(x,lag) { 
      lag(x,lag) 
    }
    
    require(dplyr) # using lag from dplyr (has opposite lead)
    # lapply saves lags to a list 
    lag1 <- lapply(df,lags, lag =1)
    lag2 <- lapply(df,lags, lag =2)
    lag3 <- lapply(df,lags, lag =3)
    
    # cbind to data frame 
    lag_1_df <- as.data.frame(do.call(cbind,lag1))
    lag_2_df <- as.data.frame(do.call(cbind,lag2))
    lag_3_df <- as.data.frame(do.call(cbind,lag3))
    
    # names 
    names_lag1 <- rep(1,length(lag_1_df))
    var_names <- rep(1:length(lag_1_df),1)
    var_names <- paste("var",var_names)
    names_lag1 <- paste(var_names,"lag",names_lag1)
    colnames(lag_1_df) <- names_lag1
    # column names lag 2
    names_lag2 <- rep(2,length(lag_2_df))
    var_names <- rep(1:length(lag_2_df),1)
    var_names <- paste("var",var_names)
    names_lag2 <- paste(var_names,"lag",names_lag2)
    colnames(lag_2_df) <- names_lag2
    # column names lag 3
    names_lag3 <- rep(3,length(lag_3_df))
    var_names <- rep(1:length(lag_3_df),1)
    var_names <- paste("var",var_names)
    names_lag3 <- paste(var_names,"lag",names_lag3)
    colnames(lag_3_df) <- names_lag3
    
    
    # Place all in same data frame 
    all_df <- cbind(lag_1_df,lag_2_df,lag_3_df)
    head(all_df)
    

    带输出:

    > head(all_df)
      var 1 lag 1 var 2 lag 1 var 3 lag 1 var 4 lag 1 var 5 lag 1 var 6 lag 1 var 7 lag 1 var 8 lag 1 var 9 lag 1
    1          NA          NA          NA          NA          NA          NA          NA          NA          NA
    2          26          27          66          82          86          53          37          24          13
    3          37          22          18          93           3          69          74          65           4
    4          57          52          96          14          98          38          94          98           3
    5          91          27          90          75          75          96          67          38          92
    6          20          18          95          98          27          11          70          46          84
      var 10 lag 1 var 11 lag 1 var 12 lag 1 var 13 lag 1 var 14 lag 1 var 15 lag 1 var 16 lag 1 var 17 lag 1 var 18 lag 1
    1           NA           NA           NA           NA           NA           NA           NA           NA           NA
    2            6           88           60            6           63           94           81           64           95
    3           35           97           95            5           21           56           48          100            7
    4           58           87           12           98           91           57           17           51           37
    5           54           44           52           80           59           10           40           94           67
    6           61           19           94            3           17           39           82           19            1
      var 19 lag 1 var 20 lag 1 var 1 lag 2 var 2 lag 2 var 3 lag 2 var 4 lag 2 var 5 lag 2 var 6 lag 2 var 7 lag 2
    1           NA           NA          NA          NA          NA          NA          NA          NA          NA
    2           77           28          NA          NA          NA          NA          NA          NA          NA
    3           59           75          26          27          66          82          86          53          37
    4           72           61          37          22          18          93           3          69          74
    5           28           51          57          52          96          14          98          38          94
    6           44           88          91          27          90          75          75          96          67
    
        3
  •  0
  •   Matt Summersgill    6 年前

    使用 shift set 从…起 data.table

    library(data.table)
    
    DT <- data.table(foo = seq_len(10),
                     bar = seq_len(10)*2L,
                     baz = seq_len(10)*3L)
    
    LagCols <- c("bar","baz")
    LagLengths <- seq_len(2)
    
    for(y in LagCols){
      for (z in LagLengths) set(DT, j = eval(paste0(y,"_lag_",z)), value = shift(DT[[y]],n = z, type = "lag"))
    }
    
    print(DT)
    

    给出以下内容:

        foo bar baz bar_lag_1 bar_lag_2 baz_lag_1 baz_lag_2
     1:   1   2   3        NA        NA        NA        NA
     2:   2   4   6         2        NA         3        NA
     3:   3   6   9         4         2         6         3
     4:   4   8  12         6         4         9         6
     5:   5  10  15         8         6        12         9
     6:   6  12  18        10         8        15        12
     7:   7  14  21        12        10        18        15
     8:   8  16  24        14        12        21        18
     9:   9  18  27        16        14        24        21
    10:  10  20  30        18        16        27        24