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

提取列表中对象的estimate属性时遇下标越界问题求助

问题原因解析

问题核心在于mapply的默认简化行为,以及代码中误传入了非数值列:

  • mapply默认参数simplify=TRUE,当传入的函数(这里是effsize::cohen.d)返回列表时,它会尝试将结果简化为矩阵。cohen.d返回的是包含estimate、置信区间、效应量量级等元素的列表,mapply会把这些列表的对应元素合并成矩阵结构——此时z是矩阵而非列表。用lapply(z, ...)遍历矩阵时,会逐个访问矩阵的单个值(而非完整的cohen.d结果对象),执行x[[3]]自然会触发下标越界错误。
  • 你的代码中包含了subjects字符列,将其传入cohen.d会生成无效结果(cohen.d仅支持数值型输入),进一步破坏了结果的结构一致性。

而Map函数不会自动简化结果,始终返回列表,每个元素都是cohen.d返回的完整结果对象,因此lapply可以正常遍历并提取estimate。

修正后的代码示例

方式1:用Map处理(推荐)

先排除非数值的subjects列,仅处理观测列:

# 拆分两组数值型观测数据
group1 <- df[1:3, -1]
group2 <- df[4:6, -1]

# 用Map计算每列的Cohen's d,返回列表
z <- Map(effsize::cohen.d, group1, group2)

# 提取所有列的estimate
estimates <- lapply(z, function(x) x$estimate)
# 或更简洁的写法
estimates <- sapply(z, `[[`, "estimate")

方式2:用mapply并关闭简化

如果坚持用mapply,需显式设置simplify=FALSE强制返回列表:

z <- mapply(effsize::cohen.d, group1, group2, simplify = FALSE)
estimates <- lapply(z, function(x) x$estimate)

内容的提问来源于stack exchange,提问作者bhumm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 02:20:15