使用epiR::epi.2by2处理分组数据框时出现列类型错误
epiR::epi.2by2配合分组数据框使用时的错误排查与解决
根据epiR::epi.2by2帮助文档说明,该函数可配合dplyr::group_by创建的分组数据框使用,但实际调用时触发错误:要求第2列(结局列)为因子,而使用cohort.time方法时,结局是事件计数(数值型),这显然不合理。以下是复现代码:
library(dplyr) library(epiR) # 生成模拟数据 df <- tibble(group = sample(c("Treatment", "Control"), 100, replace = TRUE)) |> mutate(nevents = rpois(100, 1), time = rexp(100, 1), group = factor(group)) # 分组汇总事件数和人时 dat <- df |> group_by(group) |> summarise(n = sum(nevents), time = sum(time), .groups = "keep") print(dat) #> # A tibble: 2 × 3 #> # Groups: group [2] #> group n time #> <fct> <int> <dbl> #> 1 Control 34 50.0 #> 2 Treatment 50 49.2 # 调用函数触发错误 epi.2by2(dat, method = "cohort.time") #> Error in epi.2by2(dat, method = "cohort.time"): Column 2 (outcome) must be a factor.
问题原因
- 分组数据框属性干扰:
epi.2by2对分组tibble的兼容性不佳,函数内部的变量识别逻辑会被分组属性打乱,无法正确解析数据结构。 - 未明确指定参数:未手动指定
exposure(暴露组)、outcome(事件数)、time(人时)参数,函数默认按列顺序识别:第1列为暴露,第2列为结局。但cohort.time方法要求结局是数值型事件计数,而函数默认的结局校验逻辑仍沿用二分类结局的规则(要求因子),因此产生矛盾。
解决方法
步骤1:取消数据框的分组属性
将分组tibble转换为普通数据框,消除分组属性对函数的干扰:
dat_ungrouped <- dat |> ungroup()
步骤2:明确指定参数调用函数
调用epi.2by2时,手动指定各变量对应的参数,让函数明确识别各列的作用:
result <- epi.2by2(dat = dat_ungrouped, exposure = group, outcome = n, time = time, method = "cohort.time") print(result)
这样函数就能正确识别cohort.time方法所需的数值型事件计数和人时数据,不会再触发“结局列需为因子”的错误。
内容的提问来源于stack exchange,提问作者Claudio
相关产品推荐
相关产品推荐

