计算滑动窗口内某个范围内的值

时间:2013-07-22 14:57:22

标签: r

我想解决的问题是滑动窗口越过测量数据,具有定义的窗口宽度和可控的步长(1)。

在窗口内我需要检测一定范围内的多个值 第一个价值观。 2.2 + - 0.3并计算连续的这些值的数量

expl. 2.2, 2.3, 2.1 , 1.8, 2.2, 2.5, 2.1 --> 3,1,3

d <- read.table(text="Number  Time.s      Potential.V Current.A
1       0.0000      0.075       -0.7653
2       0.0285      0.074       -0.7597
3       0.0855      0.076       -0.7549
17      0.8835      0.074       -0.7045
18      0.9405      0.073       -0.5983
19      0.9975      0.071       -0.1370
19      1.0175      0.070       -0.1370
20      1.0545      0.072        0.1295
21      1.1115      0.073        0.2680
8013    1.6555      0.076       -1.1070
8014    1.7125      0.075       -1.1850
8015    1.7695      0.073       -1.2610
8016    1.8265      0.072       -1.3460
8017    1.8835      0.071       -1.4380
8018    1.9405      0.070       -1.4350
8019    1.9975      0.061       -1.0720
8020    2.1045      0.062       -0.8823
8021    2.1115      0.058       -0.7917
8022    2.1685      0.060       -0.7481", header=TRUE)

rle(round(diff(d$Time.s[d$Time.s>1 & d$Time.s<2]),digits=2))

我不能使用rle,因为没有可以定义的接受间隔。与...合作 一个for循环是可能的,但接缝很un'R'ish。

width=4
bound.low  <- 0.00
bound.high <- 0.03
Ergebnis <- data.frame(
    Potential.V=seq(1,(nrow(d)-width),by=1),count=seq(1,(nrow(d)-width),by=1))
for (a in 1:(nrow(d)-width)) {
    temp <- d[a:(a+width),c("Time.s","Potential.V")]
    counter=0
    for (b in 1:nrow(temp)){
        if (temp$Potential.V[1]     >= (temp$Potential.V[b] - bound.low ) &
            temp$Potential.V[1] <= (temp$Potential.V[b] + bound.high)   ){
            (counter=counter+1)
        } else { break() }
 }
 Ergebnis$Potential.V[a] <- temp$Potential.V[1]
 Ergebnis$count[a]       <- counter
}
print(Ergebnis)

结果

   Potential.V count
1        0.075     2
2        0.074     1
3        0.076     5
4        0.074     5
5        0.073     5
6        0.071     2
7        0.070     1
8        0.072     1
9        0.073     1
10       0.076     5
11       0.075     5
12       0.073     5
13       0.072     5
14       0.071     5
15       0.070     5

rle(Ergebnis$count)
Run Length Encoding
  lengths: int [1:6] 1 1 3 1 3 6
  values : num [1:6] 2 1 5 2 1 5

所以我在长度向量中找到了所需的计数。

有没有更优雅的方法来解决这些问题?我对xts和动物园的实验并没有像我想的那样成功

最好的问候, IInatas

P.S。 这种数据分析的原因是来自实验的测井数据,该实验具有降级问题,其严重性与某些电压相关。最后有一个终身帐户,我会尝试根据此日志数据计算剩下的剩余部分。

1 个答案:

答案 0 :(得分:1)

以下是使用zoo::rollapply计算Ergebnis的解决方案,但您仍需要对结果运行rle

# the function we're going to apply to each window
f <- function(x, upper=0.03, lower=0.00) {
  # logical test
  l <- x[1] >= (x-lower) & x[1] <= (x+upper)
  # first FALSE value
  m <- if(any(!l)) which.min(l) else length(l)
  c(Potential.V=x[1],count=sum(l[1:m]))
}
Ergebnis <- data.frame(rollapply(d$Potential.V, 5, f, align='left'))
rle(Ergebnis$count)