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

如何在R中利用后续检查时间补全缺失的起止时间?

按ID分组填充缺失时间字段的解决方案

你的核心需求是:针对每个ID的Check序列,用下一个Check的Start_time填充当前缺失的Start_time或end_time。之前的代码因未按ID分组、索引匹配逻辑错误导致长度问题,以下是适配5000行数据集的高效处理方法:

方法一:用dplyr(tidyverse生态)

借助分组和lead()函数实现按组取后续值填充:

library(dplyr)

# 先确保数据按ID和Check排序(如果未排序)
df <- df %>% arrange(ID, Check)

# 分组填充缺失值
df_filled <- df %>%
  group_by(ID) %>%
  mutate(
    # 填充缺失的Start_time
    Start_time = ifelse(is.na(Start_time), lead(Start_time), Start_time),
    # 填充缺失的end_time
    end_time = ifelse(is.na(end_time), lead(Start_time), end_time)
  ) %>%
  ungroup()
  • group_by(ID)保证只在同一ID的Check序列内查找后续值
  • lead(Start_time)获取同组当前行的下一行Start_time值
  • 若某ID的最后一条Check存在缺失,lead()会返回NA,可根据实际需求补充处理(如保留NA或用最后一个非缺失值)

方法二:用data.table(大数据量更高效)

如果数据集后续扩容,data.table的处理速度更有优势:

library(data.table)

# 转成data.table格式并排序
setDT(df)
setorder(df, ID, Check)

# 分组填充
df_filled <- df[, 
                `:=`(
                  Start_time = fifelse(is.na(Start_time), shift(Start_time, type = "lead"), Start_time),
                  end_time = fifelse(is.na(end_time), shift(Start_time, type = "lead"), end_time)
                ),
                by = ID]
  • shift(..., type = "lead")等价于dplyr的lead(),用于获取下一行值
  • fifelse是data.table内置的高效条件判断函数,比base的ifelse速度更快

内容的提问来源于stack exchange,提问作者Bilal Jamil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 22:05:21