R如何滞后4000列50次

问题描述 投票:2回答:1

我有一个包含4000列的数据框,并且每日观察结果按time排序。我想创建新列,使其过去的所有现有列滞后50次。因此,为Y列创建50个其他列,分别为Y-1day,Y-2days,Y-3days ... Y-50days。

到目前为止,我包装了下面的循环,该循环完成了我需要做的事情。问题是它不是很快。有没有更有效的测试方法?

for(i in 2:ncol(Data)){
  for(j in 1:50){
  Data<- slide(Data, Var = names(Data[i]), slideBy = -j)
}}

我为可重现的示例附加了数据框的快照:

structure(list(time = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 
13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 
29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 
45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 
61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 
77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 
93, 94, 95, 96, 97, 98, 99, 100), A = c(17.081545, 16.630901, 
16.623749, 16.258942, 16.244635, 16.165951, 15.886981, 15.865522, 
15.529327, 15.772532, 16.04435, 15.779685, 15.915594, 15.593705, 
15.336195, 15.593705, 15.736767, 15.736767, 15.457797, 15.815451, 
16.108727, 16.237482, 15.808297, 16.058655, 16.53791, 16.988556, 
16.516453, 16.480686, 16.967096, 17.181688, 17.446352, 17.11731, 
16.952789, 16.8598, 16.795422, 16.437769, 16.587982, 16.845493, 
17.167381, 17.510729, 17.410587, 17.474964, 17.246065, 17.703863, 
17.424892, 17.174536, 17.103004, 16.695278, 16.93133, 16.638054, 
16.115879, 16.20887, 15.987124, 16.151646, 16.151646, 16.115879, 
16.173105, 16.101574, 16.080114, 15.9299, 15.879828, 15.786839, 
15.314735, 15.27897, 15.493563, 15.436337, 15.286123, 15.121602, 
15.27897, 14.88555, 14.785408, 14.592275, 14.785408, 14.856938, 
14.670959, 15.243204, 15.09299, 15.250358, 15.264664, 15.18598, 
14.771102, 14.842632, 15, 15.150214, 15.200286, 15.078684, 15.379113, 
15.658083, 15.636623, 15.879828, 15.715307, 15.729613, 15.422031, 
16.080114, 16.39485, 16.502146, 16.74535, 16.902718, 17.088697, 
16.831188), AAP = c(29.033333, 28.84, 28.893333, 28.866667, 28.700001, 
28.799999, 28.973333, 28.866667, 28.806667, 28.973333, 29.713333, 
29.033333, 28.626667, 28.546667, 28.173334, 28.166666, 28.24, 
28.553333, 28.366667, 28.733334, 28.833334, 28.9, 29.166666, 
29.846666, 30.08, 30.093334, 29.673334, 29.860001, 30.053333, 
30.186666, 29.833334, 29.673334, 34.533333, 33.82, 33.373333, 
33.633335, 33.593334, 33.833332, 33.586666, 33.946667, 34.66, 
34.599998, 34.84, 34.779999, 34.093334, 33.713333, 33.560001, 
33.933334, 33.086666, 33.139999, 33.279999, 33.200001, 33.259998, 
32.466667, 32.713333, 32.686668, 33.053333, 33.806667, 33.333332, 
33.613335, 33.633335, 33.799999, 34.206665, 34.5, 34.166668, 
34.206665, 33.933334, 34, 34.373333, 33.700001, 33.173332, 32.633335, 
32.639999, 34.013332, 33.566666, 34.053333, 34.053333, 34.826668, 
35.106667, 35.68, 35.653332, 35.566666, 35.380001, 35.419998, 
35.966667, 36.573334, 36.673332, 36.486668, 36.286667, 36.099998, 
35.433334, 35.419998, 35.84, 36.533333, 36.779999, 38.98, 39.633335, 
39.646667, 39.486668, 39.433334), AAPL = c(4.520714, 4.567143, 
4.607143, 4.610714, 4.946429, 4.925714, 4.611429, 4.675714, 4.985714, 
5.014286, 5.046429, 4.991428, 5.032857, 5.035, 5.054286, 5.146429, 
5.160714, 5.188571, 5.284286, 5.492857, 5.537857, 5.687857, 5.557857, 
5.631429, 5.638571, 5.778572, 5.624286, 5.597143, 5.800714, 6.045, 
6.315, 6.437857, 6.272143, 6.200714, 6.092143, 6.302143, 6.352143, 
6.356429, 6.408571, 6.357143, 6.302857, 5.97, 6.115714, 6.107143, 
5.79, 5.621428, 5.69, 5.752857, 5.76, 5.851429, 5.882857, 6.035714, 
6.137143, 6.242857, 6.118571, 6.078571, 6.071429, 6.075714, 5.964286, 
6.114286, 5.952857, 5.841429, 5.87, 5.984286, 6.047143, 6.222857, 
6.248571, 5.988572, 6.094285, 5.862857, 5.322857, 5.05, 5.088572, 
5.298572, 5.072857, 5.311429, 5.071429, 5.282857, 5.17, 5.135714, 
5.077143, 5.151429, 5.204286, 5.172857, 5.307143, 5.24, 5.32, 
5.281428, 5.202857, 5.087143, 4.875714, 4.967143, 5.078571, 5.051429, 
5.12, 5.364286, 5.364286, 5.68, 5.671429, 5.682857), ABC = c(14.5375, 
14.4225, 14.395, 14.5175, 14.475, 14.475, 14.51, 14.515, 14.275, 
14.3175, 14.4875, 14.375, 14.5025, 14.2525, 14.3925, 14.13, 14.47, 
14.365, 14.5925, 14.57, 14.74, 14.71, 14.995, 14.9, 14.8625, 
15.0325, 14.78, 14.875, 15.085, 15.0525, 15.4275, 15.3075, 14.9225, 
15, 14.7025, 14.7975, 15, 15, 14.975, 15.3775, 15.435, 15.5325, 
15.6625, 15.6575, 15.695, 15.1275, 15.1025, 15.0775, 15.265, 
15.0325, 14.905, 15.1975, 15.215, 15.2025, 15.1025, 15.3775, 
15.2775, 13.5075, 13.5275, 13.95, 14.3225, 14.09, 14.4275, 14.735, 
14.6475, 14.8, 14.4575, 14.62, 14.7525, 14.7, 14.9, 15.125, 14.83, 
14.9525, 14.825, 14.9625, 15, 14.975, 14.9675, 15.0975, 15.0875, 
15.32, 15.5125, 15.38, 15.51, 15.575, 15.7475, 15.9975, 15.9175, 
15.895, 15.955, 15.98, 16.209999, 16.459999, 16.5725, 16.514999, 
16.4925, 16.5, 16.495001, 16.4825), ABMD = c(15.01, 14.98, 14.69, 
14.52, 14.29, 14.42, 14.31, 14.17, 12.45, 12.05, 11.87, 11.97, 
11.41, 11.16, 11.06, 11.2, 11.1, 11.57, 11.43, 11.88, 11.58, 
11.12, 11.16, 11.32, 10.97, 10.88, 10.72, 10.3, 10.75, 10.25, 
10.29, 10.41, 10.02, 10.05, 10.08, 10, 10.24, 10.89, 10.7, 10.8, 
10.66, 10.71, 11.12, 11.18, 11.2, 10.95, 11.07, 11.12, 11.3, 
11.19, 10.83, 10.56, 10.37, 10.47, 10.33, 10.17, 10.51, 10.4, 
10.56, 10.74, 10.58, 10.6, 10.57, 10.71, 11.23, 11.28, 11.51, 
11.15, 10.98, 10.98, 11.05, 10.76, 10.96, 11.1, 10.62, 11.1, 
10.53, 10.69, 10.65, 10.73, 10.15, 10.15, 9.52, 9.6, 9.6, 9.52, 
9.47, 9.44, 9.35, 9.27, 9.13, 8.92, 9.26, 9.45, 9.97, 10.25, 
10.28, 9.99, 10.16, 10.17), ABT = c(22.392265, 22.166759, 21.912466, 
22.40666, 22.790501, 23.011208, 22.588984, 22.517014, 22.085194, 
22.19075, 22.089993, 22.09479, 21.95085, 22.061205, 22.037214, 
22.027618, 22.018023, 21.811708, 21.720547, 21.600595, 21.854891, 
21.898071, 21.907667, 21.840496, 21.874083, 21.725344, 21.667768, 
21.581404, 22.166759, 22.305902, 22.488226, 22.469034, 22.339487, 
22.26272, 21.802113, 21.946053, 22.243528, 22.200346, 22.066002, 
22.051607, 22.099588, 22.075598, 22.267517, 22.382669, 22.310699, 
22.02282, 22.209942, 22.070801, 22.128376, 21.907667, 21.792517, 
21.365494, 21.336706, 21.048826, 20.996048, 21.39908, 21.562212, 
21.677364, 21.95085, 22.430651, 22.368277, 22.161963, 22.157164, 
22.646561, 22.843279, 23.19833, 22.963228, 22.91045, 22.98242, 
23.049591, 23.169542, 23.927626, 23.500605, 23.111965, 22.69454, 
23.078381, 22.824085, 22.920046, 23.001612, 23.255905, 23.073582, 
23.586967, 23.692524, 23.634949, 23.850859, 23.601362, 23.519796, 
23.543785, 23.438231, 23.634949, 23.567776, 23.395048, 23.735706, 
23.706919, 23.678129, 23.529392, 23.452623, 23.366261, 23.351866, 
23.145552), ACN = c(26.370001, 25.75, 25.65, 25.42, 26.610001, 
26.959999, 26.5, 26.389999, 26.18, 26.290001, 26.1, 26, 25.67, 
25.16, 24.9, 25.200001, 25.4, 25.68, 25.6, 26.049999, 25.99, 
25.83, 25.48, 25.73, 25.77, 25.85, 25.51, 25.42, 25.200001, 24.639999, 
24.9, 25.049999, 24.51, 24.9, 24.799999, 24.709999, 24.48, 25.15, 
25.549999, 25.59, 25.42, 25.110001, 25.370001, 25.49, 25.32, 
25.17, 24.950001, 24.459999, 24.48, 23.98, 24.030001, 23.950001, 
23.66, 24.01, 24.280001, 24.299999, 24.4, 24.57, 24.16, 24.559999, 
24.15, 24.440001, 24.35, 24.860001, 24.969999, 24.889999, 23.700001, 
23.34, 23.440001, 23.120001, 22.860001, 22.5, 22.57, 22.440001, 
21.9, 21.959999, 21.75, 21.85, 21.549999, 21.469999, 21.620001, 
21.700001, 21.969999, 22.1, 22.1, 21.82, 22, 22.08, 21.860001, 
21.92, 21.99, 22.049999, 22.01, 22.049999, 22.5, 22.790001, 22.719999, 
22.76, 22.67, 22.34), ADBE = c(30.844999, 30.030001, 29.865, 
29.370001, 29.389999, 29.41, 29.059999, 29.49, 29.110001, 29.115, 
29.190001, 28.940001, 29.035, 28.535, 27.695, 27.790001, 28.004999, 
28.084999, 27.74, 28.450001, 28.950001, 31.145, 31.709999, 31.995001, 
31.76, 31.85, 31.295, 31.34, 31.85, 31.735001, 32.455002, 32.299999, 
31.535, 31.415001, 30.754999, 30.875, 30.695, 30.715, 30.875, 
31.17, 31.174999, 31.174999, 31.885, 32.535, 32.474998, 32.255001, 
32.654999, 32.209999, 32.669998, 32.27, 31.594999, 31.945, 33.904999, 
33.349998, 33.18, 33.134998, 33.27, 33.555, 33.110001, 33.865002, 
33.584999, 33.380001, 33.290001, 33.424999, 34.049999, 34.195, 
33.630001, 33.400002, 33.450001, 32.535, 31.74, 30.33, 27.385, 
29.049999, 28.625, 29.77, 30.145, 30.02, 29.559999, 29.225, 29.235001, 
29.735001, 28.575001, 28.645, 28.775, 28.459999, 28.85, 29.334999, 
28.76, 28.965, 28.889999, 29.049999, 29.955, 29.889999, 30.549999, 
31.059999, 31.115, 31.360001, 32.419998, 32.759998), ADI = c(36.389999, 
35.400002, 35.560001, 35.5, 35.549999, 35.41, 35.080002, 35.560001, 
35.099998, 35.639999, 36.07, 35.139999, 34.650002, 34.470001, 
34.049999, 34.299999, 34.880001, 34.830002, 34.740002, 35.889999, 
35.990002, 36.009998, 35.240002, 37.52, 37.52, 38.02, 37.18, 
36.830002, 38.049999, 37.599998, 37.32, 37.130001, 36.700001, 
36.299999, 36.5, 36.59, 37.32, 37.5, 36.720001, 38, 37.709999, 
36.93, 37.119999, 37.049999, 36.950001, 36.919998, 37.849998, 
37.130001, 37.209999, 36.57, 35.919998, 36.02, 35.830002, 35.709999, 
35.830002, 36.23, 35.799999, 35.66, 35.119999, 36.330002, 36.139999, 
35.709999, 35.599998, 35.310001, 35.41, 36.09, 35.669998, 35.34, 
34.93, 34.099998, 33.650002, 32.84, 33.360001, 33.849998, 33.419998, 
34.349998, 33.799999, 33.700001, 33.52, 33.360001, 33.52, 34.110001, 
33.849998, 33.669998, 34.560001, 34.619999, 34.619999, 34.549999, 
34.130001, 34.060001, 34.310001, 35.490002, 36.419998, 36.700001, 
36.860001, 36.889999, 37.080002, 36.529999, 36.849998, 36.290001
)), row.names = c(NA, 100L), class = "data.frame")
r time-series feature-selection feature-engineering
1个回答
3
投票

我们可以使用shift中的data.table,它可以为n取值的向量

library(data.table)
setDT(Data)
out <- Data[, shift(.SD, n = 1:50), .SDcols = -1]
names(out) <- paste0(rep(names(Data)[-1], each = 50), "_",  1:50, "days")
Data[, names(out) := out][]
© www.soinside.com 2019 - 2024. All rights reserved.