在R data.table中查找从7及以上到首次达到10及以上的时长
解决data.table中首个7+到首个10+的时长计算问题
我明白你的需求啦——要找第一个达到7及以上的时间点,到之后首次出现10及以上的时间点之间的时长,中间哪怕数值掉下去也没关系对吧?你之前的代码只盯着7到10之间的连续区间,自然满足不了需求,咱们来调整一下思路:
核心思路
- 先把字符串格式的
timestamp转换成可计算的时间类型(POSIXct) - 定位第一个数值≥7的时间点作为起始
- 在起始时间之后,定位第一个数值≥10的时间点作为结束
- 计算两个时间点的间隔时长
具体代码实现
首先确保你的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
相关产品推荐
相关产品推荐

