R语言伤病统计代码错误排查:基于0.25年间隔的次数计算
伤病时间数据集的独立伤病统计问题修正
问题需求
针对包含ID和19个伤病时间列的数据集,需新增两列:
Multiple_Injuries:二元变量(Yes/No),标记受试者是否存在多次独立伤病(两次伤病时间间隔超过0.25年即为独立)Number_of_injuries:统计受试者的独立伤病次数
原代码的核心错误
- 未对伤病时间排序:原代码直接对原始列的非NA值计算
diff(),但伤病时间列的顺序并非按时间先后排列,导致差值计算无意义,间隔判断完全错误。 - 计数逻辑完全偏离规则:原代码将非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
相关产品推荐
相关产品推荐

