R语言多列批量运行paired t-test报错如何解决
数据集多列指标t检验代码报错修正
问题说明
需要对FAI_SLS数据集中研究侧(study_side取值为"Study")的多个关节角度指标执行t检验,分析各指标从基线到随访1年的变化,先后编写两段代码均运行失败。
失败代码1及报错
res <- FAI_SLS %>% filter(study_side == "Study")%>% select(-id,-subject,-activity,-side,-study_side,-year) %>% map_df(~ broom::tidy(t.test(. ~ year)), .id = 'var')
运行返回报错:
Error in eval(predvars, data, env) : object 'year' not found
移除select()语句中的-year参数后,仍返回相同报错。
失败代码2及报错
t(sapply(FAI_SLS%>%filter(study_side == "Study")%>%select(-id,-subject,-activity,-side,-study_side,-year), function(x) unlist(t.test(x~FAI_SLS$year)[c("estimate","p.value","statistic","conf.int"])))
运行返回报错:
Error in h(simpleError(msg, call)) :
error in evaluating the argument 'x' in selecting a method for function 't': variable lengths differ (found for 'FAI_SLS$year')
移除select()语句中的-year参数后,问题仍未解决。
报错核心原因
- 代码1:
select()步骤提前删除了分组列year,后续t.test()的公式接口无法找到分组变量;即使保留year列,map_df()默认会遍历所有传入列,会将year本身作为待检验指标传入模型,仍无法正常运行。 - 代码2:
filter(study_side == "Study")已经对原数据集做了行筛选,但t检验调用的分组变量是未经过滤的全量数据集列FAI_SLS$year,和筛选后的指标列行数不匹配,触发长度报错。
可运行修正方案
注:由于是同一组受试者基线到随访1年的前后对比,属于配对设计,t检验建议加paired = TRUE参数执行配对t检验;若设计为独立样本,保留默认参数即可。
方案1:tidyverse + broom 风格(对齐原代码1逻辑)
核心是保留分组列year,遍历指标列时排除分组变量,通过动态构建公式保证变量能被正确识别:
library(tidyverse) library(broom) res <- FAI_SLS %>% filter(study_side == "Study") %>% # 仅移除无关ID类列,保留分组列year和所有关节角度指标 select(-id, -subject, -activity, -side, -study_side) %>% map_df( .x = setdiff(names(.), "year"), # 遍历除分组列year外的所有指标 .f = ~ t.test(reformulate("year", response = .x), data = ., paired = TRUE) %>% tidy(), .id = "var" )
方案2:base R 风格(对齐原代码2逻辑)
核心是提前存储过滤后的分析数据集,分组变量从过滤后的数据中提取,保证长度匹配:
# 提前存储过滤后的分析集,避免变量长度不匹配 analysis_set <- FAI_SLS %>% filter(study_side == "Study") res <- t(sapply( X = analysis_set %>% select(-id, -subject, -activity, -side, -study_side, -year), FUN = function(x) { t.test(x ~ analysis_set$year, paired = TRUE)[c("estimate","p.value","statistic","conf.int")] %>% unlist() } ))
内容的提问来源于stack exchange,提问作者Edgar Garcia
相关产品推荐
相关产品推荐

