【问题标题】:R: Clock syncs - Stepwise repetition of calculation applied to all recordsR:时钟同步 - 应用于所有记录的逐步重复计算
【发布时间】:2017-09-08 17:05:37
【问题描述】:

我正在尝试从两个时钟同步数据。每个时钟都以不同的速率漂移。我想将两台仪器上检测到的同时事件同步到一台仪器的时钟。以下是一些简单的数据,其中时间是数字,表示从某个起点开始的分钟数:

MasterClock <- c(100, 150, 200, 250, 300)
clock2 <- c(101, 153, 206, 258, 310)
df <- data.frame(MasterClock,clock2)

第一步很简单。识别同时发生的事件并计算两个时钟之间的时间差并相应地调整一个时钟。我想记录时钟之间的差异,因此我将创建时钟之间差异的新变量,然后将差异添加到原始时间以获得更正的时间,如下所示:

df$CF[1] <- df$MasterClock[1] - df$clock2[1] #calculate CorrectionFactor
df$clock2Corrected <- df$clock2 + df$CF  #calculate corrected time

给出这个:

 > df
  MasterClock clock2 CF clock2Corrected
1         100    101 -1             100
2         150    153 -1             152
3         200    206 -1             205
4         250    258 -1             257
5         300    310 -1             309

在这个简化的示例中,很容易看出每一行代表一个同时发生的事件。但是,如果您要继续时钟 2 中的趋势,最终时钟 2 将漂移得如此之远,以至于它开始看起来与主时钟上的前一个事件同时发生。这就是为什么我想首先将第一条记录的校正因子应用于所有数据,每次有机会同步时钟以保持时钟尽可能紧凑(实际数据集显然更大更复杂,增加分配错误的可能性)。

从这里我需要使用 df$clock2Corrected[2] 作为时钟 2 的新“原始时间”重复此过程。第二条记录的 CorrectionFactor (CF) 将是 df$MasterClock[2] - df$clock2Corrected [2] = -2。然后,我想将此校正因子 (-2) 应用于记录 2-n,以获得记录 2-n 的新更新同步时钟。逐步执行此操作将使时钟保持紧密,以使 CF 随着时间的推移保持较小。

有没有办法为每条记录逐步重复这个过程,而不为每一行创建一个新列?我怀疑它可能需要一个嵌套在另一个 forloop 中的 forloop,但我无法理解这个逻辑。对于这个例子,我希望最终的成品是这样的:

> df
  MasterClock clock2 CF clock2Corrected
1         100    101 -1             100
2         150    153 -2             150
3         200    206 -3             200
4         250    258 -2             250
5         300    310 -2             300

【问题讨论】:

  • @RuiBarradas 应用累积修正。

标签: r for-loop


【解决方案1】:

好的,花了一些时间,但我想我明白了。

correct_clock <- function(DF){
    DF$CF <- DF$MasterClock[1] - DF$clock2[1]
    DF$clock2Corrected <- DF$clock2 + DF$CF
    n <- nrow(DF)
    for(i in seq_len(n)[-1]){
        DF$CF[i] <- DF$MasterClock[i] - DF$clock2Corrected[i]
        DF$clock2Corrected[i:n] <- DF$clock2[i:n] + sum(DF$CF[1:i])
    }
    DF
}

correct_clock(df)
  MasterClock clock2 CF clock2Corrected
1         100    101 -1             100
2         150    153 -2             150
3         200    206 -3             200
4         250    258 -2             250
5         300    310 -2             300

然后您必须将函数correct_clock 的返回值分配给某个数据框,无论是相同的还是其他的。

result <- correct_clock(df)

【讨论】:

    猜你喜欢
    • 2021-01-21
    • 2014-01-04
    • 2021-03-12
    • 2017-12-19
    • 2021-07-17
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多