我想创建和保存先进的统计条形图与循环功能的帮助。我想更改统计分析的响应变量(使用循环)、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个条形图,但当我试图使用循环函数时,我得到了错误信息。如何修复此错误?有人能帮帮我吗?感谢您的评分
1条答案
按热度按时间beq87vna1#
您的代码中有一些错误-它们都与您使用
i
和j
有关。首先,将
lm
公式写成字符串,然后将其转换为公式。这比在调用lm()
时尝试粘贴在一起更安全,也更不容易出错:接下来,
i
和j
是dat
中的列名字符串,而不是向量。所以当你调用一个summary函数,比如mean(paste0(i))
,你不会得到列向量的平均值。你可以通过调用dat
中的实际列来解决这个问题,如下所示:在代码中还有其他一些地方会发生这种情况-请确保更新每个地方。
最后,我建议在ggplot语法中使用
ylab({{j}})
。在这些更新之后,您会发现您的绘图没有错误,例如: