基于DataFrame时间戳列校验各ID下数值低于100持续时长是否达30分钟
R语言分组校验连续低值时长问题
需求描述
现有包含三列的DataFrame,结构如下:
- 第一列为唯一ID:
HADM_ID - 第二列为数值型指标:
VALUE - 第三列为POSIXct格式时间列:
time
需要按HADM_ID分组单独校验:任意时间点起VALUE连续低于100的时长是否达到至少30分钟,结果存入新增Boolean类型列BELOW,满足条件标记为TRUE,不满足标记为FALSE,布尔值需标记在对应时段的起始行。
样例数据
前10条观测的dput导出结果如下:
> dput(bp2s[1:10]) structure(list(HADM_ID = c(100210L, 100210L, 100210L, 100210L, 100210L, 100210L, 100210L, 100210L, 100210L, 100210L), VALUE = c(112L, 120L, 121L, 112L, 106L, 109L, 80L, 89L, 85L, 99L), time = structure(c(5976682620, 5976684000, 5976687600, 5976691200, 5976694800, 5976698400, 5976785280, 5976788400, 5976790200, 5976792000), tzone = "", class = c("POSIXct", "POSIXt"))), row.names = c(NA, -10L), class = c("data.table", "data.frame"))
理想输出示例
HADM_ID VALUE TIME BELOW 1: 100210 92 2159-05-26 08:40:00 TRUE 2: 100210 98 2159-05-26 09:00:00 FALSE 3: 100210 105 2159-05-26 09:12:00 FALSE 4: 100889 92 2166-08-15 14:50:00 FALSE 5: 100889 98 2166-08-15 15:00:00 FALSE 6: 100889 101 2166-08-15 15:15:00 FALSE 7: 100520 89 2133-02-03 14:15:00 TRUE 8: 100520 102 2133-02-03 15:15:00 FALSE
实现方案问题
tidyverse方案问题
时间差计算逻辑正常,首次满足低于100超30分钟的第7条观测识别正确,但后续仍处于低于100区间的第8、9条观测被错误标记为FALSE,错误输出如下:
HADM_ID VALUE time time_diff grp below <int> <int> <dttm> <drtn> <int> <lgl> 1 100210 112 2159-05-24 15:37:00 23 mins 1 FALSE 2 100210 120 2159-05-24 16:00:00 60 mins 2 FALSE 3 100210 121 2159-05-24 17:00:00 60 mins 3 FALSE 4 100210 112 2159-05-24 18:00:00 60 mins 4 FALSE 5 100210 106 2159-05-24 19:00:00 60 mins 5 FALSE 6 100210 109 2159-05-24 20:00:00 1448 mins 6 FALSE 7 100210 80 2159-05-25 20:08:00 52 mins 6 TRUE 8 100210 89 2159-05-25 21:00:00 30 mins 6 FALSE #should be TRUE since Value stays under 100 for next 30 min 9 100210 85 2159-05-25 21:30:00 30 mins 6 FALSE #should be TRUE see above 10 100210 99 2159-05-25 22:00:00 30 mins 6 FALSE
data.table方案
输出完全符合预期,结果如下:
HADM_ID VALUE time timenext grp BELOW 1: 100210 112 2159-05-24 15:37:00 2159-05-24 15:37:00 1 FALSE 2: 100210 120 2159-05-24 16:00:00 2159-05-24 16:00:00 1 FALSE 3: 100210 121 2159-05-24 17:00:00 2159-05-24 17:00:00 1 FALSE 4: 100210 112 2159-05-24 18:00:00 2159-05-24 18:00:00 1 FALSE 5: 100210 106 2159-05-24 19:00:00 2159-05-24 19:00:00 1 FALSE 6: 100210 109 2159-05-24 20:00:00 2159-05-24 20:00:00 1 FALSE 7: 100210 80 2159-05-25 20:08:00 2159-05-25 21:00:00 2 TRUE 8: 100210 89 2159-05-25 21:00:00 2159-05-25 21:30:00 2 TRUE 9: 100210 85 2159-05-25 21:30:00 2159-05-25 22:00:00 2 TRUE 10: 100210 99 2159-05-25 22:00:00 2159-05-25 22:30:00 2 TRUE 11: 100210 89 2159-05-25 22:30:00 2159-05-25 23:00:00 2 FALSE 12: 100210 102 2159-05-25 23:00:00 2159-05-25 23:00:00 3 FALSE
内容的提问来源于stack exchange,提问作者Chickenleg Joe
相关产品推荐
相关产品推荐

