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

使用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.

问题原因

  1. 分组数据框属性干扰:epi.2by2对分组tibble的兼容性不佳,函数内部的变量识别逻辑会被分组属性打乱,无法正确解析数据结构。
  2. 未明确指定参数:未手动指定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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 08:42:38