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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 08:52:41