如何高效检查生存时间序列的逻辑合理性?
解决方案
核心逻辑:合理的生存序列只能从1(存活)转为0(死亡),不能反向。因此只需检查每行时间序列中是否存在从0到1的跳跃(即diff(序列)出现1的情况)。
方法1:dplyr 逐行处理(直观易懂)
library(dplyr) dat_clean <- dat %>% rowwise() %>% mutate( # 提取当前行的所有时间列,转为数值向量 survival_vec = as.numeric(as.character(c_across(starts_with("timeperiod")))), # 检查是否存在复活(0→1)的情况 has_resurrect = any(diff(survival_vec) == 1), # 标记逻辑状态 logic_status = ifelse(has_resurrect, "not ok", "ok") ) %>% # 移除中间辅助变量 select(-survival_vec, -has_resurrect)
方法2:dplyr + purrr(大样本更高效)
避免rowwise()的性能损耗,用pmap批量处理每行:
library(dplyr) library(purrr) dat_clean <- dat %>% mutate( logic_status = pmap_chr(select(., starts_with("timeperiod")), function(...) { survival_vec <- as.numeric(as.character(c(...))) ifelse(any(diff(survival_vec) == 1), "not ok", "ok") }) )
方法3:Base R 原生实现(无需加载包)
# 筛选所有时间列 time_cols <- grep("timeperiod", names(dat), value = TRUE) # 将时间列转为数值矩阵 survival_mat <- apply(dat[time_cols], 2, function(x) as.numeric(as.character(x))) # 逐行检查是否存在复活情况 has_resurrect <- apply(survival_mat, 1, function(x) any(diff(x) == 1)) # 添加逻辑状态列 dat$logic_status <- ifelse(has_resurrect, "not ok", "ok")
内容的提问来源于stack exchange,提问作者Em Laskey
相关产品推荐
相关产品推荐

