1

我想解决的问题是滑动窗口以定义的窗口宽度和可控的步宽(有 1 个)遍历测量数据。

在窗口内,我需要检测第一个值 expl 一定范围内的多个值。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 循环是可能的,但接缝非常不合情理。

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 和 zoo 的实验并没有像我想象的那样成功

最好的问候, IInatas

PS 进行此数据分析的原因是来自实验的日志数据,该实验具有与某些电压相关的严重性日益严重的退化问题。最后有一个终身帐户,我尝试根据此日志数据计算剩余的帐户。

4

1 回答 1

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)
于 2014-02-06T13:39:59.347 回答