R中时差循环的矢量化

Vectorization for Time Difference Loop in R

我有一个非常大的事件数据集 (df),其中每一行对应一个测量值、时间点 (df$TimeSec) 和事件 ID (df$Source)。

下面的循环创建一个列,df$TimeDiff,它计算当前行时间戳和下一个时间戳之间的时间差。它还会检查 Source 是否已更改,因此新事件的第一行的 TimeDiffNA

我正在尝试将我的思维方式从循环转变为利用 R 的矢量化,并希望提高处理速度。

for(i in 1:nrow(df)){
  if(df$Source[i+1] == df$Source[i]){
    df$TimeDiff[i+1] <- df$TimeSec[i+1] - df$TimeSec[i]
  }else{
    df$TimeDiff[i+1] <- NA
  }
}

总而言之,上面的循环完全符合我的要求,但我想看看是否有更好的方法来节省处理时间。谢谢!

一些关于时间序列的指针正在使用 ts 库或类似库。在 base R 中,我们有 difflag 函数。 ifelse 函数还简化了 if(){}else{} 句子的向量化。

对于您的特定问题,您可以先向量化 if 语句:

cond <- diff(df$source) == 0 #if two sources are equal, their difference is 0

接下来我们可以使用单个 ifelse 调用来执行整个计算

df$TimeDiff <- 0 #initial column value
df$TimeDiff[-1] <- ifelse(cond, diff(df$TimeSec), NA)

这应该会很快。

经过一番挖掘,我找到了另一个使用 dplyr:

的解决方案
df %>% 
  group_by(Source) %>% 
  mutate(TimeDiff = TimeSec - lag(TimeSec))

运行一眨眼的过程。