【问题标题】:Vectorization for Time Difference Loop in RR中时差循环的矢量化
【发布时间】:2019-09-16 01:56:30
【问题描述】:

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

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

我正在尝试将我的思维方式从循环转变为利用 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
  }
}

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

【问题讨论】:

    标签: r loops vectorization


    【解决方案1】:

    时间序列的一些指针正在使用ts 库或类似库。在基础 R 中,我们有 diff 和 lag 函数。 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)
    

    这应该相当快。

    【讨论】:

    • 感谢您的帮助!这肯定解决了它,经过更多挖掘后,我找到了另一个解决方案,它也解决了我将发布的问题。
    • 很高兴我能帮上忙 :-)
    【解决方案2】:

    经过一番挖掘,我找到了另一个使用dplyr的解决方案:

    df %>% 
      group_by(Source) %>% 
      mutate(TimeDiff = TimeSec - lag(TimeSec))
    

    眨眼间就完成了整个过程。

    【讨论】:

      猜你喜欢
      • 2016-02-11
      • 2012-06-11
      • 2020-05-03
      • 1970-01-01
      • 2020-06-03
      • 1970-01-01
      • 1970-01-01
      • 2019-02-28
      相关资源
      最近更新 更多