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

如何高效检查生存时间序列的逻辑合理性?

解决方案

核心逻辑:合理的生存序列只能从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 00:57:14