【问题标题】:R - Timer based on column data (Condition has been true for x time) for large data setsR - 大型数据集的基于列数据的计时器(条件已为 x 时间)
【发布时间】:2017-09-05 00:21:25
【问题描述】:

免责声明:我是 R 新手,我已经寻找答案。有类似的问题,但我在将我读到的内容翻译成对我的实施有意义的东西时遇到了问题。

我正在尝试添加一个条件计时器列,它测量 sampleCondition = TRUE 的时间量。如果 Condition 返回 false,则计时器应重置。注意:我正在尝试摆脱 for 循环。我目前正在以秒为单位计算 ConditionTime,但样本可能是几分钟。 最终结果应如下所示:ConditionTime

我仍在学习,到目前为止,我为改进大型数据集所做的每一次尝试都会打破一切。 (大约 100 万行)有人可以提供示例解决方案或指出我正确的方向吗?任何帮助是极大的赞赏。 :)

#create sample DateTime
DateTime <- c("2017-09-01 09:37:04", "2017-09-01 09:38:04", "2017-09-01 09:39:04", "2017-09-01 09:40:04", "2017-09-01 09:41:04", "2017-09-01 09:42:04", "2017-09-01 09:43:04")
#create sample condition
sampleCondition <- c(0,1,0,0,1,1,0)
#create sample DF
sampleDF <- data.frame(DateTime,sampleCondition)

#calculate the time diff from data point to data point
sampleDF$rowTimeDiff <- c(0,difftime(sampleDF$DateTime[2:length(sampleDF$DateTime)], sampleDF$DateTime[1:(length(sampleDF$DateTime)-1)] ,  units = "secs"))


#check if condition is true (else NA), check if condition was true in the last row. ConditionTime = sum of ConditionTime[previous row] and rowTimeDiff 
for (i in 1:length(sampleDF$DateTime)) {
  sampleDF$ConditionTime[i] <- ifelse(sampleDF$sampleCondition[i] == 1, 
                                      ifelse(is.na(sampleDF$ConditionTime[i-1]), sampleDF$rowTimeDiff[i], sum(sampleDF$ConditionTime[i-1], sampleDF$rowTimeDiff[i]))
                                      , NA ) 
  i <- i + 1
}

再次感谢!

编辑:为了清晰起见,添加了更多数据以进行采样。

【问题讨论】:

    标签: r datetime conditional elapsedtime


    【解决方案1】:

    试试这个:

    x <- sampleDF$sampleCondition
    
    (cumsum(x)-cummax((!x)*cumsum(x)))*60
    [1]   0  60   0   0  60 120   0
    

    时间测试:

    microbenchmark(
      cumsum(x)-cummax((!x)*cumsum(x))*60
    )
    
    Unit: nanoseconds
    expr min    lq    mean median     uq   max neval
      60 973 989.5 1357.09   1060 1139.5 23265   100
    

    样本数据:

    sampleDF <- data.frame(
      DateTime=c("2017-09-01 09:37:04", "2017-09-01 09:38:04", "2017-09-01 09:39:04", "2017-09-01 09:40:04", "2017-09-01 09:41:04", "2017-09-01 09:42:04", "2017-09-01 09:43:04"),
      sampleCondition=c(0,1,0,0,1,1,0),
    )
    

    【讨论】:

    • 完美地完成了这项工作,而且也非常优雅。我已将其扩展到 140k 行数据,并在纳秒内处理。快如闪电!!非常感谢您抽出宝贵时间提供帮助,非常感谢!
    • @JeremiahMyers - 不客气。很高兴听到它运作良好。编码愉快。
    猜你喜欢
    • 2020-02-25
    • 1970-01-01
    • 2017-08-18
    • 1970-01-01
    • 1970-01-01
    • 2016-12-10
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    相关资源
    最近更新 更多