R - 计算数据帧中列的效率

时间:2017-08-21 20:09:16

标签: r dataframe

我有时间在数据框中有几列。我试图计算新列中时间的差异,但每次遇到新模式的开始时我都需要将其重置为零。请参阅下面的一些示例数据。

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
  }
}

有关如何提高效率的任何建议吗?

2 个答案:

答案 0 :(得分:0)

您可以使用(内置)difftime函数以及来自dplyr的lagmutate执行此操作:

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为零。