R - 根据行b,滑动窗口

时间:2016-04-17 19:28:44

标签: r data.table time-series sliding-window

编码新手,也是新手。我正在研究一个R脚本,一个时间序列分析。该脚本旨在检测平均值随时间的变化,并基于触发器(增加1或减少1),返回时间戳,将个人指向平均值开始增加/减少的位置,以及它达到最高或最低相对点的地方。这是我到目前为止编写的代码(现在运行良好):

#Calculate row averages, adding an "Average" column to the data set
DATAFRAME2 <- DATAFRAME[, .(Average = rowMeans(.SD, na.rm = TRUE)), "V1"]

#Calculate NegativeChange and PositiveChange using subscript method (NEW)
NegativeChange <- numeric(nrow(DATAFRAME2))
PositiveChange <- numeric(nrow(DATAFRAME2))
for (i in seq(nrow(DATAFRAME2))) {
  y <- i+1
  x <- i+90
  NegativeChange[i] <- (min(DATAFRAME2[y:x,Average]) - DATAFRAME2[i, Average])
  PositiveChange[i] <- (max(DATAFRAME2[y:x,Average]) - DATAFRAME2[i, Average])
}

#add NegativeChange and PositiveChange data to datatable
DATAFRAME3 <- DATAFRAME2[, .(V1, Average, NegativeChange, PositiveChange)]

产生这个(只是一个快照,数据表超过4000行):

    > DATAFRAME3[1:32,]
           V1  Average NegativeChange PositiveChange
 1: 00:00:01| 8.000000    -3.00000000     -2.2500000
 2: 00:00:03| 5.750000    -0.75000000     -0.3088235
 3: 00:00:04| 5.333333    -0.33333333      0.1078431
 4: 00:00:05| 5.230769    -0.23076923      0.2104072
 5: 00:00:06| 5.150000    -0.15000000      0.2911765
 6: 00:00:07| 5.150000    -0.15000000      0.2911765
 7: 00:00:08| 5.150000    -0.15000000      0.2911765
 8: 00:00:10| 5.150000    -0.15000000      0.2911765
 9: 00:00:11| 5.136364    -0.13636364      0.3048128
10: 00:00:12| 5.130435    -0.13043478      0.3107417
11: 00:00:13| 5.125000    -0.12500000      0.3161765
12: 00:00:14| 5.107143    -0.10714286      0.3340336
13: 00:00:15| 5.103448    -0.10344828      0.3377282
....
30: 00:00:36| 5.000000     0.00000000      1.0606061
31: 00:00:38| 5.000000     0.02941176      1.0606061
32: 00:00:39| 5.029412     0.00000000      1.0311943

我在生成EndTimestamp向量时遇到问题。我写的代码如下:

#calculate EndTimestamp 
EndTimestamp <- c()
for (i in seq(nrow(DATAFRAME3))) {
  y <- i+1
  x <- i+90
  if (DATAFRAME3[i,NegativeChange] <= -1) {
    EndTimestamp <- append(EndTimestamp, as.character(DATAFRAME3[Average == min(DATAFRAME3[y:x,Average]), V1]))
  } else {
  EndTimestamp <- append(EndTimestamp, "")
  }
}
EndTimestamp

当NegativeChange [i]&lt; = -1时,循环找到Average [i:i + 90]中的最低平均值,但随后返回相应Average值等于的数据集中的每个V1值。平均值[i:i + 90]中的最低值。因此,如果它在上面的数据表的第1行调用,它会发现min(Average [1:90])为5,然后返回V1 [30] AND V1 [31](如果数据表中有任何其他行其中平均值为5,它也将返回那些)。我只希望在满足条件时返回一个V1值 - 特别是在[i:i + 90]范围内的值。

任何帮助/指示将不胜感激。我知道必须有一个更好/更合适的方法来解决这个问题,但对R和编码来说是新手,我不太确定在哪里看。

0 个答案:

没有答案