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)
我有一个 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)