使用apply函数进行配对比较遇问题,寻求技术指导
问题分析与解决
核心问题
你当前的sapply用法存在两处关键错误:
- 遍历
data$id但完全未使用循环变量x,等于重复执行同一操作6次,完全没实现配对遍历 - 直接将整个病例组(3个值)和对照组(3个值)传入
newfunction,但你的函数是为单个值比较编写的,向量比较会返回多个布尔值,if语句只会读取第一个值,导致逻辑混乱
正确实现方式
步骤1:拆分病例组与对照组数据
先单独提取干预组1(病例)和干预组2(对照)的死亡结果:
case_outcomes <- data[data$intervention == 1, "mortality_30d"] control_outcomes <- data[data$intervention == 2, "mortality_30d"]
步骤2:生成所有配对组合并比较
用expand.grid生成3×3的所有配对索引,再通过mapply逐个调用newfunction完成比较:
# 生成所有配对的索引组合 pairs <- expand.grid(case_idx = seq_along(case_outcomes), control_idx = seq_along(control_outcomes)) # 遍历所有配对执行比较 result <- mapply(newfunction, case_outcomes[pairs$case_idx], control_outcomes[pairs$control_idx])
步骤3:验证结果
运行后result即为你需要的9个值的向量:
> result [1] -1 0 0 1 0 0 1 0 0
函数简化(可选)
你的newfunction可以改成向量化版本,无需循环直接生成所有结果:
newfunction_vec <- function(case_vec, control_vec) { sign(control_vec - case_vec) } # 直接生成所有配对结果 result_vec <- newfunction_vec(rep(case_outcomes, each = 3), rep(control_outcomes, 3))
完整修正代码
## simulate data data <- data.frame( id = c(1, 5, 6, 11, 15, 21), intervention = c(2, 2, 2, 1, 1, 1), mortality_30d = c(0, 1, 0, 1, 0, 0) ) ## create new function to compare the outcome and determine result newfunction <- function (outcome_case, outcome_control){ if (outcome_case < outcome_control) {result = 1} if (outcome_case > outcome_control) {result = -1} if (outcome_case == outcome_control) {result = 0} return(result) } # 拆分病例组和对照组结果 case_outcomes <- data[data$intervention == 1, "mortality_30d"] control_outcomes <- data[data$intervention == 2, "mortality_30d"] # 生成所有配对并执行比较 pairs <- expand.grid(case_idx = seq_along(case_outcomes), control_idx = seq_along(control_outcomes)) test <- mapply(newfunction, case_outcomes[pairs$case_idx], control_outcomes[pairs$control_idx]) # 查看最终结果 test
内容的提问来源于stack exchange,提问作者Mel36
相关产品推荐
相关产品推荐

