在sapply中使用自定义effect_size函数报错求助
问题排查与解决方案
核心问题分析
你的报错和警告来自两个关键错误:
sapply的FUN参数用法错误:你直接把effect_size(6, try$pbs_m, ...)这个函数调用表达式传给了sapply的FUN参数。sapply要求FUN是一个函数对象,而不是先执行函数调用后的结果——这会导致R试图把函数的返回值当成函数来调用,自然抛出match.fun错误。- 参数传递方式错误:你的
effect_size是为单个样本设计的(处理单个数值的均值、标准误),但你直接传入了整列向量,这就触发了“对象长度不匹配”的警告。
解决方案
根据你的需求,推荐以下几种批量处理方式:
1. 用mapply多参数批量调用(最适配你的场景)
mapply专门用于多输入参数的批量函数调用,会自动按位置匹配每行的参数:
# 先确认你的函数定义(示例,确保参数顺序正确) effect_size <- function(n, mean1, mean2, sem1, sem2) { # 从标准误计算标准差:sd = sem * sqrt(n) sd1 <- sem1 * sqrt(n) sd2 <- sem2 * sqrt(n) # 计算合并标准差 pooled_sd <- sqrt(((n-1)*sd1^2 + (n-1)*sd2^2)/(2*n - 2)) # Cohen's d (mean1 - mean2)/pooled_sd } # 批量处理数据框每行 cohens_d_results <- mapply( effect_size, n = 6, # 固定样本量,自动重复匹配数据框行数 mean1 = try$pbs_m, mean2 = try$nm_m, sem1 = try$pbs_sem, sem2 = try$nm_sem )
2. 用dplyr逐行处理(更直观的 tidyverse 风格)
如果习惯用tidyverse工具,rowwise()可以让函数逐行作用于数据框:
library(dplyr) # 新增一列存储效应量结果 try <- try %>% rowwise() %>% mutate(cohens_d = effect_size(6, pbs_m, nm_m, pbs_sem, nm_sem)) %>% ungroup()
3. 修正sapply的用法(手动逐行索引)
如果一定要用sapply,需要把函数包装成接收行索引的匿名函数,手动提取每行的参数:
cohens_d_results <- sapply(1:nrow(try), function(row_idx) { effect_size( 6, try$pbs_m[row_idx], try$nm_m[row_idx], try$pbs_sem[row_idx], try$nm_sem[row_idx] ) })
验证要点
- 确认
effect_size函数的参数顺序和你传入的列顺序完全匹配 - 检查
try数据框的所有目标列(pbs_m、nm_m、pbs_sem、nm_sem)确实长度一致
内容的提问来源于stack exchange,提问作者Steven Haworth
相关产品推荐
相关产品推荐

