R语言 用于创建和保存具有响应变量相关性的高级统计条形图(gglot)的函数循环

aydmsdu9  于 2023-09-27  发布在  其他
关注(0)|答案(1)|浏览(89)

我想创建和保存先进的统计条形图与循环功能的帮助。我想更改统计分析的响应变量(使用循环)、y轴的名称和y轴的最大限值。我试过这些,但我得到了错误消息。

library(ggplot2)
library(agricolae)
library(dplyr)

dat <- mtcars
dat$cyl <- factor(dat$cyl)
attach(dat)

selected_dat <- dat[,c(1,3:7)]
selected_names <- names(selected_dat)
ylab_names <- c(expression("MPG (unit "[A]* ")"), expression("disp (unit "[B]* ")"), expression("hp (unit "[C]* ")"),  
                expression("drat (unit "[D]* ")"), expression("wt (unit "[E]* ")"), expression("qsec (unit "[F]* ")"))

for (i in selected_names) {
   for (j in ylab_names) {

model_1 <- lm(paste0(i)~cyl, data=dat)
out <- HSD.test(model_1, "cyl", group = T)
out_names <- out$groups
out_names <- tibble::rownames_to_column(out_names, "cyl")
ordered_outnames <- out_names[match(levels(dat$cyl), out_names$cyl),]
new_data <- data.frame(lapply(ordered_outnames, as.character), stringsAsFactors=FALSE)
statistics_letter <- new_data$groups

ylimit_max <- c(mean(paste0(i)) + sd(paste0(i)) + sd(paste0(i)))

df <- dat %>%
  group_by(cyl) %>%
  summarise(
    n=n(),
    mean = round(mean(paste0(i), na.rm = T),2),
    sd = sd(paste0(i), na.rm = T))

rplot <- ggplot(df, aes(x = cyl,  y = mean,  fill=cyl)) +
  ylab(paste0("j")) +
  xlab("cyl") +
  geom_bar(stat="identity", lwd=1.25, width=0.6) +
  geom_errorbar(aes(ymin=mean-sd, ymax=mean+sd),width=.2, lwd=0.5,col="black", na.rm = T) +
  stat_summary(aes(label=stat(y)), fun.y=mean, geom="text", colour="darkblue", size=5, position=position_dodge(0.85), vjust = 8) +
  geom_text(aes(label = statistics_letter, y=mean+sd), position = position_dodge(0.85), color="black", size=6, vjust = -2) +
  geom_text(aes(y = max(mean)/10, label = paste0("n = ", n)), position = position_dodge(0.85), size=5, colour="darkred") +  
  scale_y_continuous(limits = c(0, ylimit_max)) 
ggsave(rplot, file=paste0(i, ".png"), width = 10, height = 8.5, units = "in")

    }
  }

我想为这些响应变量分别获得这种类型的条形图:mpg、disp、hp、drat、wt、qsec(共6个图表)。

我想创建和保存一次共6个条形图,但当我试图使用循环函数时,我得到了错误信息。如何修复此错误?有人能帮帮我吗?感谢您的评分

beq87vna

beq87vna1#

您的代码中有一些错误-它们都与您使用ij有关。
首先,将lm公式写成字符串,然后将其转换为公式。这比在调用lm()时尝试粘贴在一起更安全,也更不容易出错:

frml <- as.formula(paste(i, "~ cyl")) # if `cyl` can be variable, paste the var name
model_1 <- lm(frml, data=dat)

接下来,ijdat中的列名字符串,而不是向量。所以当你调用一个summary函数,比如mean(paste0(i)),你不会得到列向量的平均值。你可以通过调用dat中的实际列来解决这个问题,如下所示:

ylimit_max <- c(mean(dat[[i]]) + sd(dat[[i]]) + sd(dat[[i]]))

在代码中还有其他一些地方会发生这种情况-请确保更新每个地方。
最后,我建议在ggplot语法中使用ylab({{j}})
在这些更新之后,您会发现您的绘图没有错误,例如:

相关问题