R中时差循环的矢量化
Vectorization for Time Difference Loop in R
我有一个非常大的事件数据集 (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
}
}
总而言之,上面的循环完全符合我的要求,但我想看看是否有更好的方法来节省处理时间。谢谢!
一些关于时间序列的指针正在使用 ts
库或类似库。在 base 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)
这应该会很快。
经过一番挖掘,我找到了另一个使用 dplyr
:
的解决方案
df %>%
group_by(Source) %>%
mutate(TimeDiff = TimeSec - lag(TimeSec))
运行一眨眼的过程。
我有一个非常大的事件数据集 (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
}
}
总而言之,上面的循环完全符合我的要求,但我想看看是否有更好的方法来节省处理时间。谢谢!
一些关于时间序列的指针正在使用 ts
库或类似库。在 base 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)
这应该会很快。
经过一番挖掘,我找到了另一个使用 dplyr
:
df %>%
group_by(Source) %>%
mutate(TimeDiff = TimeSec - lag(TimeSec))
运行一眨眼的过程。