【发布时间】:2017-05-01 09:43:00
【问题描述】:
我试图避免 for 循环并使用 apply 代替我检测到的后处理标志。
我有一个时间序列,其中有一列显示质量是否正常。数据框如下所示:
n <- 100
tstart <- strptime("12/15/16 16:00:00", "%m/%d/%y %H:%M:%S")
df <- data.frame(Date = tstart + seq(0,n*5-1,5) + sample(seq(0,3,1), n, replace = T),
Check = sample(c("FLAG", "PASS"), n, replace = T))
# head of df
# Date Check
# 1 2016-12-15 16:00:02 FLAG
# 2 2016-12-15 16:00:05 PASS
# 3 2016-12-15 16:00:13 FLAG
# 4 2016-12-15 16:00:17 PASS
# 5 2016-12-15 16:00:22 FLAG
# 6 2016-12-15 16:00:26 FLAG
虽然我不喜欢接收所有FLAGs。我想申请三个条件:
1) 忽略与上一行时间差超过 60 秒的标志
2) 我想保留已经重复了一段时间的标志。
我是这样实现的:
df$Time_Difference <- c(0,as.numeric(diff(df$Date)))
df$Flag_Counter <- 0
desired_rep <- 3
# Start the clock!
ptm <- proc.time()
for (row_index in 2:nrow(df)){
if (df[row_index, "Time_Difference"] > 60){
df[row_index, "Flag_Counter"] <- 0
}
else {
if (df[row_index, "Check"] == "PASS"){
df[row_index, "Flag_Counter"] <- max(0, df[row_index-1, "Flag_Counter"] - 1)
}
else {
df[row_index, "Flag_Counter"] <- min(desired_rep, df[row_index-1, "Flag_Counter"] + 1)
}
}
}
# Stop the clock
x <- proc.time() - ptm
print(x[3])
所以,for 循环实际上是获取连续重复desired_rep 次的标志。如果我们在两个FLAGs 之后有一个PASS,则1 是Flag_Counter,最后我们做df[, df$Flag_Counter == 3],我们可以后处理标志。现在,这是非常缓慢的。我想知道我们是否可以使用apply 来加快这项任务。我在Python 中完成了此操作,但我不知道如何访问我的预定义函数中的前几行,然后使用apply。我感谢您的帮助。
【问题讨论】:
-
这是一个难以重现的示例,因为行之间的时间差不超过 60 秒。另外,你想要的结果是什么?只是一个新列,FlagCounter?
-
涉及随机过程的例子,please add
set.seedfor reproducibility.