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

R语言伤病统计代码错误排查:基于0.25年间隔的次数计算

伤病时间数据集的独立伤病统计问题修正

问题需求

针对包含ID和19个伤病时间列的数据集,需新增两列:

  • Multiple_Injuries:二元变量(Yes/No),标记受试者是否存在多次独立伤病(两次伤病时间间隔超过0.25年即为独立)
  • Number_of_injuries:统计受试者的独立伤病次数

原代码的核心错误

  1. 未对伤病时间排序:原代码直接对原始列的非NA值计算diff(),但伤病时间列的顺序并非按时间先后排列,导致差值计算无意义,间隔判断完全错误。
  2. 计数逻辑完全偏离规则:原代码将非NA值的数量直接作为独立伤病次数,忽略了“间隔>0.25年才算独立”的核心规则——比如同一时段内的多次记录应算作1次独立伤病,而非记录数。

修正后的解决方案

# 定义函数:计算单一行的独立伤病次数
count_independent_injuries <- function(x) {
  # 提取非NA伤病时间并按时间排序
  sorted_times <- sort(na.omit(x))
  n_times <- length(sorted_times)
  
  if (n_times == 0) {
    return(0)  # 无伤病记录
  } else if (n_times == 1) {
    return(1)  # 仅1次伤病
  } else {
    # 计算相邻伤病的时间间隔
    time_diffs <- diff(sorted_times)
    # 独立伤病数 = 初始1次 + 间隔超过0.25年的次数
    independent_count <- 1 + sum(time_diffs > 0.25)
    return(independent_count)
  }
}

# 生成独立伤病次数列
data$Number_of_injuries <- apply(data[, grepl("^X", colnames(data))], 1, count_independent_injuries)
# 生成是否多次独立伤病的二元列
data$Multiple_Injuries <- ifelse(data$Number_of_injuries > 1, "Yes", "No")

关键修正点

  • 强制排序:先对每行的非NA伤病时间排序,确保差值是真实的时间先后间隔,符合规则逻辑。
  • 正确计数逻辑:以1次为基础,每出现一个超过0.25年的间隔,就新增1次独立伤病,完全匹配需求。
  • 边界场景覆盖:处理了无伤病、仅1次伤病的极端情况,避免逻辑漏洞。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 03:08:23