我有时间在数据框中有几列。我试图计算新列中时间的差异,但每次遇到新模式的开始时我都需要将其重置为零。请参阅下面的一些示例数据。
100
我使用以下脚本估算delta列。对于每种模式,Seq列始终在增加。在此示例中,每个模式的Seq都从0开始,但可能并非总是如此。
Seq ATime RT
0 18:33:00 0
20 18:48:00 15
43 19:01:00 13
56 19:47:00 24
0 21:33:00 0
9 21:45:00 12
22 21:55:00 10
45 22:13:00 18
0 06:33:00 0
22 06:47:00 14
45 06:59:00 12
62 07:22:00 23
85 07:48:00 26
虽然它有效,但它根本没有效率。有时候' dat_4' dataframe将有大约400万条记录,只需要2.5分钟就可以完成这一步骤。
dat_4$RT <- 0
for (i in 1:(NROW(dat_4$Seq)-1)) {
if (dat_4$Seq[i+1] > dat_4$Seq[i]) {
dat_4$RT[i+1] = (chron(times=dat_4$ATime[i+1]) - chron(times=dat_4$ATime[i]))*1440
} else {
dat_4$RT[i+1] = 0
}
}
有关如何提高效率的任何建议吗?
答案 0 :(得分:0)
您可以使用(内置)difftime
函数以及来自dplyr的lag
和mutate
执行此操作:
library(dplyr)
dat_4 %>%
mutate(RT = as.numeric(difftime(ATime, lag(ATime, default = ATime[1]), units = "min")),
RT = RT * (Seq > lag(Seq, default = 0)))
第一步计算每对之间的差异(以分钟为单位),第一步从零开始。第二种情况是Seq
不会增加到0的所有情况。
答案 1 :(得分:0)
您可以首先计算所有行的RT,然后找到应设置为0的所有行。这样可以避免for循环,并且可能更快。
dat_4$RT <- c(0, diff(chron(times=dat_4$ATime)) * 1440)
dat_4$RT[which(sign(diff(dat_4$Seq)) == -1) + 1] <- 0
第一行将diff
使用chron
类似于你的方式,但避免在循环中执行此操作。第二行检测Seq
何时减少,并将这些行设置为RT为零。