我正在尝试同步两个时钟的数据。每个时钟都以不同的速率漂移。我想将两台仪器上检测到的同时事件同步到一台仪器的时钟。以下是一些简单数据,其中时间是数字,表示从某个起点开始的分钟数:
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
在这个简化的例子中,很容易看出每一行代表一个同时发生的事件。但是,如果你要继续clock2中的趋势,那么最终clock2将漂移到目前为止它将开始看起来与主时钟上的前一个事件同时发生。这就是为什么我想首先将第一个记录的校正因子应用到所有数据,每次机会同步时钟以保持时钟尽可能紧(实际数据集显然更大更复杂,增加分配错误的可能性)。
从这里我需要使用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
答案 0 :(得分:2)
好的,花了一段时间,但我想我已经得到了它。
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)