R语言多条件统计问题:日期范围内指定OPCS代码计数错误排查
问题解决:统计每行符合条件的OPCS代码次数
问题根源
原代码的核心错误在于:mget(grep("^f\\.41272", names(m.data), value = TRUE))返回的是整个列的向量列表,搭配mapply调用时,opcs_col和date_col会传入整列数据,而start_date和end_date是每行的单个值,导致sum计算的是整列中满足条件的总数,而非每行内部多组OPCS/日期对的符合条件数。
正确解法(data.table原生风格)
我们可以通过逐行遍历,将每行的OPCS代码与对应日期配对后统计:
library(data.table) # 转换所有日期列格式(原代码此部分正确,补充首尾日期列的转换) date_cols <- grep("^f\\.41282", names(m.data), value = TRUE) m.data[, (date_cols) := lapply(.SD, as.Date, format = "%Y-%m-%d"), .SDcols = date_cols] m.data[, c("date_range_start", "date_range_end") := lapply(.SD, as.Date, format = "%Y-%m-%d"), .SDcols = c("date_range_start", "date_range_end")] # 定义逐行统计函数 count_row_opcs <- function(opcs, dates, start, end, target_codes) { pairs <- data.frame(opcs = opcs, dates = dates) sum(pairs$opcs %in% target_codes & pairs$dates >= start & pairs$dates <= end) } # 逐行应用函数 m.data[, opcs_count := count_row_opcs( opcs = c(f.41272.0.0, f.41272.0.1), dates = c(f.41282.0.0, f.41282.0.1), start = date_range_start, end = date_range_end, target_codes = opcs_anaesthetist ), by = .I] # by=.I指定逐行处理 # 输出结果验证 print(m.data$opcs_count) # 预期输出:0 0 2 1 0 0
适配多组列的灵活解法
如果后续会增加更多f.41272.*和f.41282.*列,可以用动态列名提取,避免硬编码:
# 动态提取OPCS和日期列名 opcs_cols <- grep("^f\\.41272", names(m.data), value = TRUE) date_cols <- grep("^f\\.41282", names(m.data), value = TRUE) # 逐行动态获取当前行的OPCS和日期值并统计 m.data[, opcs_count := { current_opcs <- unlist(.SD[, opcs_cols, with = FALSE]) current_dates <- unlist(.SD[, date_cols, with = FALSE]) sum(current_opcs %in% opcs_anaesthetist & current_dates >= date_range_start & current_dates <= date_range_end) }, by = .I]
结果验证
运行上述代码后,opcs_count列结果完全符合预期:
- 第3行计数为2(A113、A143均属于目标代码且对应日期在范围内)
- 第4行计数为1(G451属于目标代码且对应日期在范围内)
- 其余行计数为0
内容的提问来源于stack exchange,提问作者Ben G
相关产品推荐
相关产品推荐

