Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 使用data.table创建滞后列_R_Data.table - Fatal编程技术网

R 使用data.table创建滞后列

R 使用data.table创建滞后列,r,data.table,R,Data.table,背景: 假设我有这个代码 library(data.table) #reproducibility set.seed(45L) #make table dt <- data.table(V1=c(1L,2L), V2=LETTERS[1:3], V3=round(rnorm(4),4), V4 = 1:12) dt 我想附加10列V3的滞后 问题: 在“数据表”范例中是否有一种方法可

背景:
假设我有这个代码

library(data.table)

#reproducibility
set.seed(45L)

#make table
dt <- data.table(V1=c(1L,2L),
                 V2=LETTERS[1:3],
                 V3=round(rnorm(4),4),
                 V4 = 1:12)
dt
我想附加10列V3的滞后

问题:
在“数据表”范例中是否有一种方法可以做到这一点

更多详细信息:
如果是data.frame,那么我可以做一个循环

dt <- as.data.frame(dt)


for(i in 1:10){
     dt <- cbind(dt, shift(x = dt[, 3], 
                           n = i, 
                           fill = NA, 
                           type = "lag"))
     names(dt)[ncol(dt)] <- sprintf("lag_%06d",i)
}

dt
必须有一种更优雅的方式。它可以更快、更高效地处理更大的数据


现在,如果我想先这样做,在V3列上做10个滞后,然后在V4列上做10个滞后,而不预先假定它们的名称。我可以简单地创建嵌套for循环,但我再次怀疑data.table提供了一些好的(很棒的?)功能。

是的,
shift
考虑了这种类型的用户需求。当
shift
的参数
n
是一个向量时,
shift
将为
n
中的每个移位返回一个列表:

dt[, sprintf("V3_lag_%06d", 1:10) := shift(V3, 1:10, type = 'lag')]
dt[, sprintf("V4_lag_%06d", 1:10) := shift(V4, 1:10, type = 'lag')]

#     V1 V2      V3 V4 V3_lag_000001 V3_lag_000002 V3_lag_000003 V3_lag_000004 V3_lag_000005
#  1:  1  A  1.2322  1            NA            NA            NA            NA            NA
# 2:  2  B  1.6094  2        1.2322            NA            NA            NA            NA
# 3:  1  C  0.4016  3        1.6094        1.2322            NA            NA            NA
# 4:  2  A -0.2730  4        0.4016        1.6094        1.2322            NA            NA
# 5:  1  B  1.2322  5       -0.2730        0.4016        1.6094        1.2322            NA
# 6:  2  C  1.6094  6        1.2322       -0.2730        0.4016        1.6094        1.2322
# 7:  1  A  0.4016  7        1.6094        1.2322       -0.2730        0.4016        1.6094
# 8:  2  B -0.2730  8        0.4016        1.6094        1.2322       -0.2730        0.4016
# 9:  1  C  1.2322  9       -0.2730        0.4016        1.6094        1.2322       -0.2730
# 10:  2  A  1.6094 10        1.2322       -0.2730        0.4016        1.6094        1.2322
# 11:  1  B  0.4016 11        1.6094        1.2322       -0.2730        0.4016        1.6094
# 12:  2  C -0.2730 12        0.4016        1.6094        1.2322       -0.2730        0.4016
# V3_lag_000006 V3_lag_000007 V3_lag_000008 V3_lag_000009 V3_lag_000010 V4_lag_000001
# 1:            NA            NA            NA            NA            NA            NA
# 2:            NA            NA            NA            NA            NA             1
# 3:            NA            NA            NA            NA            NA             2
# 4:            NA            NA            NA            NA            NA             3
# 5:            NA            NA            NA            NA            NA             4
# 6:            NA            NA            NA            NA            NA             5
# 7:        1.2322            NA            NA            NA            NA             6
# 8:        1.6094        1.2322            NA            NA            NA             7
# 9:        0.4016        1.6094        1.2322            NA            NA             8
# 10:       -0.2730        0.4016        1.6094        1.2322            NA             9
# 11:        1.2322       -0.2730        0.4016        1.6094        1.2322            10
# 12:        1.6094        1.2322       -0.2730        0.4016        1.6094            11
# V4_lag_000002 V4_lag_000003 V4_lag_000004 V4_lag_000005 V4_lag_000006 V4_lag_000007
# 1:            NA            NA            NA            NA            NA            NA
# 2:            NA            NA            NA            NA            NA            NA
# 3:             1            NA            NA            NA            NA            NA
# 4:             2             1            NA            NA            NA            NA
# 5:             3             2             1            NA            NA            NA
# 6:             4             3             2             1            NA            NA
# 7:             5             4             3             2             1            NA
# 8:             6             5             4             3             2             1
# 9:             7             6             5             4             3             2
# 10:             8             7             6             5             4             3
# 11:             9             8             7             6             5             4
# 12:            10             9             8             7             6             5
# V4_lag_000008 V4_lag_000009 V4_lag_000010
# 1:            NA            NA            NA
# 2:            NA            NA            NA
# 3:            NA            NA            NA
# 4:            NA            NA            NA
# 5:            NA            NA            NA
# 6:            NA            NA            NA
# 7:            NA            NA            NA
# 8:            NA            NA            NA
# 9:             1            NA            NA
# 10:             2             1            NA
# 11:             3             2             1
# 12:             4             3             2

也可以在1
data.table
call中完成所有操作。如果您需要创建许多列,这可能特别有用:

cols <- c("V3","V4")
dt[, (paste0("lag_",rep(cols, each = 10), "_", rep(1:10, times = length(cols)))) := 
            unlist(lapply(.SD, function(x) shift(x, 1:10, type = "lag")), recursive = F), .SDcols = cols]

Mike H.的答案对我不起作用——我想可能是因为data.table更新。修改后的表格为:

lagcols <- c('test1','test2') #input column names

lagcols2<- paste0("lag",  #output column names
  rep(lag, times = length(lagcols)),'_',
  rep(lagcols, each = length(lag)))

lag <- c(1,2,10) #desired lags

dt[, (lagcols2) :=  shift(.SD, lag), by=id]

lagcols仅供参考,无需使用
c(f()):=
@Frank包装函数,我一直认为在创建多个列时应该使用
c()
。是否执行
数据。表将首先检查
LHS
是否为函数?仅在一种情况下需要
DT[,x:=]
将创建一个名为
x
的列以方便(无需用引号括起来,如
“x”:=
),但这意味着如果要动态定义
x
,则必须将其括在括号中,
x=“col”;DT[,(x):=]
。哇!data.table太性感了。我在data.frame上运行了一整夜(字面上)该死的东西,但没有完成。这实际上是在几分钟内完成的。Data.table非常性感。哇,在一个电话中包装的可读性较差,但根据我的基准测试,比我的答案快一点+1当然可读性较差,我只是认为如果他必须滞后于许多不同的列(这样就不需要太多的键入),可能会有所帮助。然而,对于仅有的几列,我肯定会选择您的解决方案,我将其包装在一个循环中。我确实有很多专栏,但是哇。我想data.table可能是我最好的新朋友。。。从数字上来说,这几乎对我有效,也许一些数据。表格更新改变了一些事情。张贴修改后的版本如下。
cols <- c("V3","V4")
dt[, (paste0("lag_",rep(cols, each = 10), "_", rep(1:10, times = length(cols)))) := 
            unlist(lapply(.SD, function(x) shift(x, 1:10, type = "lag")), recursive = F), .SDcols = cols]
dt[,1:9]
#    V1 V2      V3 V4 lag_V3_1 lag_V4_1 lag_V3_2 lag_V4_2 lag_V3_3
# 1:  1  A  0.3408  1       NA       NA       NA       NA       NA
# 2:  2  B -0.7033  2   0.3408        1       NA       NA       NA
# 3:  1  C -0.3795  3  -0.7033        2   0.3408        1       NA
# 4:  2  A -0.7460  4  -0.3795        3  -0.7033        2   0.3408
# 5:  1  B  0.3408  5  -0.7460        4  -0.3795        3  -0.7033
# 6:  2  C -0.7033  6   0.3408        5  -0.7460        4  -0.3795
# 7:  1  A -0.3795  7  -0.7033        6   0.3408        5  -0.7460
# 8:  2  B -0.7460  8  -0.3795        7  -0.7033        6   0.3408
# 9:  1  C  0.3408  9  -0.7460        8  -0.3795        7  -0.7033
#10:  2  A -0.7033 10   0.3408        9  -0.7460        8  -0.3795
#11:  1  B -0.3795 11  -0.7033       10   0.3408        9  -0.7460
#12:  2  C -0.7460 12  -0.3795       11  -0.7033       10   0.3408
lagcols <- c('test1','test2') #input column names

lagcols2<- paste0("lag",  #output column names
  rep(lag, times = length(lagcols)),'_',
  rep(lagcols, each = length(lag)))

lag <- c(1,2,10) #desired lags

dt[, (lagcols2) :=  shift(.SD, lag), by=id]