如何在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
相关产品推荐
相关产品推荐

