forloop R 中的一个函数

forloop over a function in R

我有一个 t.test 函数,我想循环 myvec <- c("am", "vs")。任何帮助将不胜感激,非常感谢。

   myvec <- c("am", "vs")


my_signif = function(x, digits) floor(x) + signif(x %% 1, digits)

  t.test.df <- function(x,y,df){
   
     df$am <- factor(df$am)
    
    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)
    
    
    my.diff = round(sqrt(sd1^2/nrow(df[df$am == 0,]) + sd2^2/nrow(df[df$am == 1,])), 2) 
    out = data.frame(a = paste0(est1, " (",sd1,")"), b = paste0(est2, " (",sd2,")"), 
                     c = paste0(est1 - est2, " (",my.diff,")" , 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)
t.test.df2 <- function(cols,y,df) do.call(rbind,lapply(cols, function(x) t.test.df(x,y,df)))

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 (1.92)**
    disp 290.38 (110.17) 143.53 (87.2) 146.85 (34.98)***
    gear     3.21 (0.42)   4.38 (0.51)   -1.17 (0.17)***
and
                vs0            vs1             diff
mpg     16.62 (3.86)   24.56 (5.38)   -7.94 (1.7)***
disp 307.15 (106.77) 132.46 (56.89) 174.69 (29.4)***
gear     3.56 (0.86)    3.86 (0.53)      -0.3 (0.25)

你可以把函数改成-

t.test.df <- function(x,y,df){
  
  df[[y]] <- factor(df[[y]])
  
  t = t.test(reformulate(y, x), 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)
  my.diff = round(sqrt(sd1^2/nrow(df[df$am == 0,]) + sd2^2/nrow(df[df$am == 1,])), 2) 
  out = data.frame(a = paste0(est1, " (",sd1,")"), b = paste0(est2, " (",sd2,")"), 
                   c = paste0(est1 - est2, " (",my.diff,")" , sig), row.names = x)
  
  colnames(out) = c(paste0(y,levels(df[[y]])[1]), paste0(y,levels(df[[y]])[2]), "diff")
  out
}

现在使用 lapply -

应用函数
cols = c("mpg", "disp", "gear")
new_cols <- c("am", "vs")

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

t.test.df2(cols,"am",mtcars)
lapply(new_cols, function(x) t.test.df2(cols,x,mtcars))

#[[1]]
#                 am0           am1              diff
#mpg     17.15 (3.83)  24.39 (6.17)    -7.24 (1.92)**
#disp 290.38 (110.17) 143.53 (87.2) 146.85 (34.98)***
#gear     3.21 (0.42)   4.38 (0.51)   -1.17 (0.17)***

#[[2]]
#                 vs0            vs1              diff
#mpg     16.62 (3.86)   24.56 (5.38)   -7.94 (1.74)***
#disp 307.15 (106.77) 132.46 (56.89) 174.69 (29.14)***
#gear     3.56 (0.86)    3.86 (0.53)       -0.3 (0.25)