You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R data.table中查找从7及以上到首次达到10及以上的时长

解决data.table中首个7+到首个10+的时长计算问题

我明白你的需求啦——要找第一个达到7及以上的时间点,到之后首次出现10及以上的时间点之间的时长,中间哪怕数值掉下去也没关系对吧?你之前的代码只盯着7到10之间的连续区间,自然满足不了需求,咱们来调整一下思路:

核心思路

  1. 先把字符串格式的timestamp转换成可计算的时间类型(POSIXct)
  2. 定位第一个数值≥7的时间点作为起始
  3. 在起始时间之后,定位第一个数值≥10的时间点作为结束
  4. 计算两个时间点的间隔时长

具体代码实现

首先确保你的data.table加载完成,然后执行以下步骤:

library(data.table)

# 1. 先把timestamp转换为POSIXct时间格式(适配你的日期格式:日-月-年 时:分)
DT[, timestamp := as.POSIXct(timestamp, format = "%d-%m-%Y %H:%M")]

# 2. 找到第一个数值≥7的时间点
start_time <- DT[Value >= 7, timestamp][1]

# 3. 在起始时间之后,找第一个数值≥10的时间点
end_time <- DT[timestamp >= start_time & Value >= 10, timestamp][1]

# 4. 计算时长(单位:分钟)
duration <- difftime(end_time, start_time, units = "mins")

# 整理成结果表
result <- data.table(
  start_timestamp = start_time,
  end_timestamp = end_time,
  duration_mins = as.numeric(duration)
)

print(result)

代码解释

  • 转换时间格式是关键:原始的timestamp是字符串,必须转成POSIXct才能进行时间差计算
  • 用[1]来确保取第一个符合条件的记录,完全匹配你“取第一个符合条件区间”的要求
  • 不管起始点之后数值怎么波动,只要找到第一个≥10的点就停止,完美覆盖你“期间数值低于7也无妨”的需求

边界情况处理(可选)

如果存在没有符合条件的记录(比如没有≥7的,或者有≥7但之后没有≥10的),可以加个判断避免报错:

if (length(start_time) == 0) {
  warning("未找到数值≥7的记录")
} else if (length(end_time) == 0) {
  warning("找到数值≥7的记录,但之后无数值≥10的记录")
} else {
  print(result)
}

针对你原有代码的问题分析

你之前用rleid((value >7 & value <10 ))是在分组连续处于7到10之间的区间,这和你的需求完全不匹配——你的需求允许中间数值低于7,只要是从第一个≥7开始到之后第一个≥10就行,所以这个分组逻辑不对哦~

内容的提问来源于stack exchange,提问作者Victor Johnzon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:42:53