仅使用ggplot2为某些变量创建boxplot循环

时间:2018-05-30 14:12:14

标签: r data-science

我有一个包含99个观测值的数据集,我需要为其中包含特定字符串的数据集创建箱图。但是,当我运行此代码时,我从原始函数而不是循环中获得了57个完全相同的图。我想知道如何防止图形被覆盖但仍然创建全部57.这是代码和图片的情节。 谢谢!

Boxplot Format

    #starting boxplot function
     myboxplot <- function(mydata=ivf_dataset, myexposure = 
     "ART_CURRENT", myoutcome = "MEG3_DMR_mean")
     {bp <- ggplot(ivf_dataset, aes(ART_CURRENT, MEG3_DMR_mean)) 
     bp <- bp + geom_boxplot(aes(group =ART_CURRENT))
     }

     #pulling out variables needed for plots
     outcomes = names(ivf_dataset)[grep("_DMR_", names(ivf_dataset), 
     ignore.case = T)]

     #creating loop for 57 boxplots
     allplots <- list()
     for (i in seq_along(outcomes))
     {
     allplots[[i]]<- myboxplot (myexposure = "ART_CURRENT", myoutcome = 
     outcomes[i])  
     }
     allplots

1 个答案:

答案 0 :(得分:0)

我建议阅读标准和非标准评估,以及它如何与tidyverse一起使用。这是一些链接

http://adv-r.had.co.nz/Functions.html#function-arguments

http://adv-r.had.co.nz/Computing-on-the-language.html

我也发现这很有用

https://rstudio-pubs-static.s3.amazonaws.com/97970_465837f898094848b293e3988a1328c6.html

此外,您需要生成一个示例,以便可以复制您的问题。这是我创建的数据。

df <- data.frame(label = rep(c("a","b","c"), 5), 
                x = rnorm(15),
                y = rnorm(15),
                x2 = rnorm(15, 10),
                y2 = rnorm(15, 5))

我保留了大部分代码,只更改了需要更改的内容。

myboxplot2 <- function(mydata = df, myexposure, myoutcome){
 bp <- ggplot(mydata, aes_(as.name(myexposure), as.name(myoutcome))) +
   geom_boxplot()
 print(bp)
}
myboxplot2(myexposure =  "label", myoutcome =  "y")

由于aes()使用非标准评估,因此您需要使用aes_()。再次阅读上面的链接。

这里我得到所有以x开头的列。我假设你的代码获得了你想要的列。

outcomes <- names(df)[grep("^x", names(df), ignore.case = TRUE)]

在这里,我以与你相同的方式循环。我只存储绘图对象。

allplots <- list()
for (i in seq_along(outcomes)){
  allplots[[i]]<- myboxplot2(myexposure = "label", myoutcome = outcomes[i])$plot
}
allplots