report t.test value efficiently in R

Viewed 82

I have 2- different groups namely, am.0 and am.1 and I would like to create a data frame that shows mean(sd) of each group as well as diff(sd) with it t.test sign ***. Many thanks in advance.

mtcars$am <- factor(mtcars$am)    
        
    my.mtcars <- mtcars %>%
          dplyr::group_by(am)%>%
          dplyr::summarise(
            mean = mean(mpg),
            sd = sd(mpg)); my.mtcars 
    
    my.mtcars$sd <- paste0("(", round(my.mtcars$sd,2), ")") ; my.mtcars 
     

Expected Answer is a data frame

        am.0            am.1      diff (SD)
mpg    17.1 (3.83)  24.4 (6.17)   17.1-24.4 (SD)**
disp   ...            ...          ...
gear   ...            ...          ...
    

Where SD is the standard error of the difference between two independent samples,

SD = sqrt(s_1^2/n1 + s_2^2/n2)
1 Answers

This is my rather brute attempt:

my_signif = function(x, digits) floor(x) + signif(x %% 1, digits)
t.test.df <- function(x,y,df)
{
  t = t.test(eval(parse(text=x))~eval(parse(text=y)), df)
  p = t$p.value
  sig = ifelse(p < 0.001,"***", ifelse(p < 0.01, "**", ifelse(p < 0.05, "*", "")))
  est1 = my_signif(t$estimate[1],2)
  est2 = my_signif(t$estimate[2],2)
  sd1 = my_signif(sd(df[[x]][df[[y]] == levels(df[[y]])[1]]),2)
  sd2 = my_signif(sd(df[[x]][df[[y]] == levels(df[[y]])[2]]),2)
  out = data.frame(a = paste0(est1, " (",sd1,")"), b = paste0(est2, " (",sd2,")"), c = paste0(est1 - est2, " (",sig,")"),row.names = x)
  colnames(out) = c(paste0(y,levels(df[[y]])[1]), paste0(y,levels(df[[y]])[2]), "diff")
  out
}
t.test.df("mpg","am",mtcars)

output:

> t.test.df("mpg","am",mtcars)
             am0          am1       diff
mpg 17.15 (3.83) 24.39 (6.17) -7.24 (**)

Further:

t.test.df2 <- function(cols,y,df) do.call(rbind,lapply(cols, function(x) t.test.df(x,y,df)))

output:

cols = c("mpg", "disp", "gear")
t.test.df2(cols,"am",mtcars)

                 am0           am1         diff
mpg     17.15 (3.83)  24.39 (6.17)   -7.24 (**)
disp 290.38 (110.17) 143.53 (87.2) 146.85 (***)
gear     3.21 (0.42)   4.38 (0.51)  -1.17 (***)
Related