提取列表中对象的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
相关产品推荐
相关产品推荐

