我在R中有以下数据表:
> head(oil.data)
Quarter US_GDP UK Canada MiddleEast Africa Total_Oil_Production
1: 2008Q1 14685.3 77.22900 96.73333 0.06666667 7784.333 1290.3
2: 2008Q2 14668.4 78.19967 98.36667 0.36666667 7988.200 1212.8
3: 2008Q3 14813.0 78.29500 98.46667 0.13333333 8090.567 1302.0
4: 2008Q4 14843.0 78.63800 97.56667 0.60000000 8120.800 1136.6
5: 2009Q1 14549.9 78.47733 98.23333 0.30000000 8197.200 846.4
6: 2009Q2 14383.9 79.22400 99.70000 0.40000000 8278.100 748.3
> tail(oil.data)
Quarter US_GDP UK Canada MiddleEast Africa Total_Oil_Production
1: 2014Q3 17270.0 84.91467 111.8667 -0.9333333 11175.43 1500.0
2: 2014Q4 17522.1 85.44067 111.8333 -3.2000000 11029.73 1451.2
3: 2015Q1 17615.9 85.19467 112.2000 -0.2000000 10941.33 1392.3
4: 2015Q2 17649.3 86.17133 114.5000 0.9333333 10858.97 1346.3
5: 2015Q3 17913.7 86.65300 115.7000 -0.1000000 10985.20 1554.4
6: 2015Q4 18060.2 86.85767 116.9000 0.8000000 10933.03 1542.6
目标: 生成每列的多个滞后版本并附加到data.table
我可以使用以下一行成功完成此操作: 让我们说例如我想要滞后两次,
oil.data[, c(paste("US_GDP_lag" , 1: 2, sep="")) := lapply(1: 2, function(i) c(rep(NA, i), head(US_GDP, -i)))]
我得到以下信息:
> head(oil.data)
Quarter US_GDP UK Canada MiddleEast Africa Total_Oil_Production US_GDP_lag1 US_GDP_lag2
1: 2008Q1 14685.3 77.22900 96.73333 0.06666667 7784.333 1290.3 NA NA
2: 2008Q2 14668.4 78.19967 98.36667 0.36666667 7988.200 1212.8 14685.3 NA
3: 2008Q3 14813.0 78.29500 98.46667 0.13333333 8090.567 1302.0 14668.4 14685.3
4: 2008Q4 14843.0 78.63800 97.56667 0.60000000 8120.800 1136.6 14813.0 14668.4
5: 2009Q1 14549.9 78.47733 98.23333 0.30000000 8197.200 846.4 14843.0 14813.0
6: 2009Q2 14383.9 79.22400 99.70000 0.40000000 8278.100 748.3 14549.9 14843.0
对于每一列,我可以继续这样做,但如果我有大量的列,这可能是一个繁琐的过程。我的目标是创建一个功能。我做了以下事情:
lag.data.table <- function(data.set, lag.period) {
col.names <- names(data.set)
for(col in col.names) {
lagged.df <- data.set[, c(paste(paste(col, "_l", sep=""), 1: lag.period, sep="")) := lapply(1: lag.period, function(i) c(rep(NA, i), head(col, -i)))]
}
lagged.df
}
所有滞后列都是NA
:我在这里做错了什么?
> head(lag.df)
Quarter US_GDP UK Canada MiddleEast Africa Total_Oil_Production Quarter_l1 Quarter_l2 US_GDP_l1 US_GDP_l2 UK_l1 UK_l2 Canada_l1 Canada_l2 MiddleEast_l1 MiddleEast_l2
1: 2008Q1 14685.3 77.22900 96.73333 0.06666667 7784.333 1290.3 NA NA NA NA NA NA NA NA NA NA
2: 2008Q2 14668.4 78.19967 98.36667 0.36666667 7988.200 1212.8 NA NA NA NA NA NA NA NA NA NA
3: 2008Q3 14813.0 78.29500 98.46667 0.13333333 8090.567 1302.0 NA NA NA NA NA NA NA NA NA NA
4: 2008Q4 14843.0 78.63800 97.56667 0.60000000 8120.800 1136.6 NA NA NA NA NA NA NA NA NA NA
5: 2009Q1 14549.9 78.47733 98.23333 0.30000000 8197.200 846.4 NA NA NA NA NA NA NA NA NA NA
6: 2009Q2 14383.9 79.22400 99.70000 0.40000000 8278.100 748.3 NA NA NA NA NA NA NA NA NA NA
Africa_l1 Africa_l2 Total_Oil_Production_l1 Total_Oil_Production_l2
1: NA NA NA NA
2: NA NA NA NA
3: NA NA NA NA
4: NA NA NA NA
5: NA NA NA NA
6: NA NA NA NA
我研究过任何有内置功能的延迟,但那些只做一列一个滞后版本。
我还找到了之前的answer,但并没有完全按照我的目的去做。
答案 0 :(得分:1)
您似乎在for循环中的lapply函数中将列名前后的引号引起来。当创建带有名称列表的向量时,它们会被引号引起来。在拥有head(col, -i)
的末尾,您实际上是在调用字符串,而不是要查找的对象。如果将其替换为head(data.set[[col]], -i)
,它将为您工作。完整功能应为:
lag.data.table <- function(data.set, lag.period) {
col.names <- names(data.set)
for(col in col.names) {
lagged.df <- data.set[, c(paste(paste(col, "_l", sep=""), 1: lag.period, sep="")) := lapply(1: lag.period, function(i) c(rep(NA, i), head(data.set[[col]], -i)))]
}
lagged.df
}