编码新手,也是新手。我正在研究一个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和编码来说是新手,我不太确定在哪里看。