首页 文章

在数据框列表中应用滚动功能

提问于
浏览
0

我有一个数据框列表,每个数据框对应一个日期,每个数据框的行对应一天中的每小时时段 . 我需要在每天的等效时间戳上应用滚动功能 .

例如,对于滚动5期间窗口,我想要将函数应用于每个01:00:00,02:00:00,依此类推,前5天的时间戳滚动直到结束=长度(列表) -5,每个函数应用程序产生一个值 . 结果将是长度结束的每个时间戳的值向量 .

我正在考虑创建一个新的数据框列表,其中每个数据框对应一个时间戳,行对应天数,在这种情况下,我想知道将当前数据帧列表转换为这种新格式的最佳方法 . 但是,如果还有其他更有效的方法,我可以接受其他建议 .

Edit: 我've tried to include an example data set and result below, but I don'知道如何正确格式化数据

例如,如果列表包含4个具有以下格式的数据帧 . Col1是一个变量,Col2是另一个变量

Date    Time    Col1    Col2
1   2014-08-12  09:00:00    -0.0001079389   0.0002159128
2   2014-08-12  09:30:00    -0.0002158895   0.0002159361
3   2014-08-12  10:00:00    -0.0001079739   0.0008642109
4   2014-08-12  10:30:00    -0.0003241666   0.0003242717
5   2014-08-12  11:00:00    -0.0006482282   0.0005405113
6   2014-08-12  11:30:00    -0.0010794474   0.0002160294
7   2014-08-12  12:00:00    -0.0002157963   0.0002158429
8   2014-08-12  12:30:00    -0.0001079040   0.0009716600
9   2014-08-12  13:00:00    -0.0005397528   0.0002159827
10  2014-08-12  13:30:00    0.0000000000    0.0005398111
11  2014-08-12  14:00:00    0.0000000000    0.0003238517
12  2014-08-12  14:30:00    -0.0002158895   0.0003239216
13  2014-08-12  15:00:00    -0.0002159128   0.0001079739
14  2014-08-12  15:30:00    0.0000000000    0.0008642109
15  2014-08-12  16:00:00    -0.0003240966   0.0004322922
16  2014-08-12  16:30:00    -0.0003241666   0.0003242717
17  2014-08-12  17:00:00    -0.0008642109   0.0001080789
18  2014-08-12  17:30:00    -0.0001079739   0.0004320121
19  2014-08-12  18:00:00    -0.0005396945   0.0001079739

如果函数的滚动窗口是2,使用诸如乘法之类的简单函数,前两个数据帧中的等效行将相乘,向前滚动直到第3和第4个数据帧中的等效行相乘 .

Res1 = data.frame(matrix(NA,ncol=3,nrow=19))
rownames(Res1) = Example[[1]][,2]
colnames(Res1) = c("2014-08-13","2014-08-14","2014-08-15")
Res1[,1]= Example[[1]][,3]*Example[[2]][,3]
Res1[,2]= Example[[2]][,3]*Example[[3]][,3]
Res1[,3]= Example[[3]][,3]*Example[[4]][,3]

这是一个简单的例子,因为我想要应用的函数将一次向前滚动5个数据帧中的等效行 . 下面,该函数仅应用于Col1变量以简化,但我会分别对所有变量执行此操作 .

结果应如下所示,其中第一列名称是每个滚动窗口的结尾,因此4个数据帧,相当于4个日期变为3列

row.names   2014-08-13  2014-08-14  2014-08-15
1   09:00:00    0.000000e+00    0.000000e+00    4.612407e-08
2   09:30:00    6.987091e-08    0.000000e+00    0.000000e+00
3   10:00:00    6.987846e-08    6.954805e-08    4.614140e-08
4   10:30:00    4.889919e-07    1.621737e-07    2.307567e-08
5   11:00:00    0.000000e+00    0.000000e+00    0.000000e+00
6   11:30:00    6.977682e-07    4.869397e-07    8.083873e-08
7   12:00:00    2.325015e-08    5.794719e-08    1.154280e-07
8   12:30:00    0.000000e+00    0.000000e+00    0.000000e+00
9   13:00:00    5.816615e-08    0.000000e+00    0.000000e+00
10  13:30:00    0.000000e+00    9.270554e-08    6.921964e-08
11  14:00:00    0.000000e+00    0.000000e+00    0.000000e+00
12  14:30:00    0.000000e+00    0.000000e+00    9.224832e-08
13  15:00:00    1.627863e-07    1.621387e-07    2.305836e-08
14  15:30:00    0.000000e+00    0.000000e+00    0.000000e+00
15  16:00:00    6.972068e-08    0.000000e+00    0.000000e+00
16  16:30:00    1.045980e-07    3.122420e-07    4.148280e-07
17  17:00:00    0.000000e+00    0.000000e+00    2.419698e-07
18  17:30:00    0.000000e+00    0.000000e+00    2.303854e-07
19  18:00:00    5.810978e-08    1.040920e-07    6.218404e-07

1 回答

  • 0

    对于发现自己处于此链接的其他人,我在this link找到了答案

    确切地说,我做了以下操作,之后您可以将滚动功能应用于新形成的数据

    DataSample = lapply(DataList, function(x) with(x,x[x$Col==Idx,,drop=FALSE]))
    
    DataSample = data.frame(matrix(unlist(DataSample),nrow=noDays,byrow=T),stringsAsFactors=FALSE)
    

相关问题