用列号代替列名的 T 检验

问题描述

我正在尝试使用 RStatixt_test() 执行一系列 T 检验,其中每个测试中的因变量都相同并且分组变量发生变化。我在循环内进行这些测试,所以我想选择带有列号而不是列名的分组变量。我曾尝试使用 colnames(dataframe)[[columnnumber]] 执行此操作,但出现以下错误:“无法提取不存在的列”。如何使用列号而不是列名来选择分组变量?

下面是一个带有虚构数据框的最小可复制示例;当指明分组变量的名称(性别)时,测试可以正常工作,但当指明列号时则不能正常工作。

library(tidyverse)
library(rstatix)
dat<-data.frame(gender=rep(c("Male","Female"),1000),age=rep(c("Young","Young","Old","Old"),500),tot= round(runif(2000,min=0,max=1),0))

dat %>% t_test(tot ~ gender,detailed=T) ##Works

dat %>% t_test(tot ~ colnames(dat)[[1]],detailed=T) ##Doesn't work

解决方法

colnames(dat)[1] 是一个字符串。 t_test 需要公式对象,您需要将字符串转换为公式并传入 t_test。这可以使用 reformulateas.formula 来完成。

library(rstatix)
dat %>% t_test(reformulate(colnames(dat)[1],'tot'),detailed=T)

# A tibble: 1 x 15
#  estimate estimate1 estimate2 .y.   group1 group2    n1    n2 statistic
#*    <dbl>     <dbl>     <dbl> <chr> <chr>  <chr>  <int> <int>     <dbl>
#1    0.011     0.505     0.494 tot   Female Male    1000  1000     0.492
# … with 6 more variables: p <dbl>,df <dbl>,conf.low <dbl>,#   conf.high <dbl>,method <chr>,alternative <chr>
,

如果我们想使用 tidyverse 的构造方式,那么使用 expr

library(rstatix)
dat %>%
     t_test(formula = eval(rlang::expr(tot ~ !! rlang::sym(names(.)[1]))),detailed = TRUE)
# A tibble: 1 x 15
#  estimate estimate1 estimate2 .y.   group1 group2    n1    n2 statistic     p    df conf.low conf.high method alternative
#*    <dbl>     <dbl>     <dbl> <chr> <chr>  <chr>  <int> <int>     <dbl> <dbl> <dbl>    <dbl>     <dbl> <chr>  <chr>      
#1    -0.02     0.497     0.517 tot   Female Male    1000  1000    -0.894 0.371 1998.  -0.0639    0.0239 T-test two.sided

注意:值是不同的,因为数据是在没有任何 set.seed (wrt rnorm) 的情况下构建的