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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 13:50:24