簡體   English   中英

將列名傳遞到ggplot2中的圖形函數

[英]Passing column names into graph function in ggplot2

我有一個大型數據集,其中包含多個因變量,但只有兩個自變量(我將一遍又一遍地使用它來對許多因變量進行排序)。 對每個因變量進行兩次測量,一次在治療前,一次在治療后。 我想編寫一個函數,使我能夠為這些多個因變量中的每一個獲取圖形,該函數的參數作為我希望繪制的任何因變量的兩個列名。

我生成了一個玩具數據集來說明我的問題。 “ t1DV1”和“ t1DV2”是因變量1的治療前和治療后分數。“ t1DV2”和“ t2DV2”是因變量2的治療前和治療后分數。“組”是自變量。

group <- factor(rep(c("A", "B"), 10))
t1DV1 <- runif(20, min = 0, max = 10)
t2DV1 <- runif(20, min = 0, max = 10)
t1DV2 <- runif(20, min = 0, max = 10)
t2DV2 <- runif(20, min = 0, max = 10)

df <- data.frame(group, t1DV1, t2DV1, t1DV2, t2DV2)

df

我嘗試編寫以下功能

DVGraph <- function (DV1, DV2) { 

require(tidyr)

dfLong <- gather(df, prePost, Score, DV1:DV1)

require(ggplot2)

barGraph <- ggplot(dfLong, aes(group, Score, fill = prePost)) + 
  geom_bar(stat = "identity", position = "dodge", size = 0.5) +
  scale_fill_manual(values = c("#999999", "#666666")) +
  xlab("") +
  ylab("Scores") +
  theme_bw()

return(barGraph)

}

然后嘗試使用第一個重復測量變量來調用它(我本可以同樣使用第二個變量,即t1DV2和t2DV2)

DVGraph(t1DV1, t2DV1)

但是我得到一個錯誤。

我嘗試像這樣使用倒逗號

DVGraph("t1DV1", "t2DV1")

但是我又遇到了另一個錯誤。

有人知道我該怎么做嗎?

將您的gather調用更改為以下內容:

dfLong <- gather(df, prePost, Score, DV1, DV2)

然后,當您調用函數時,請使用列號而不是列名:

DVGraph(2, 3)

在此處輸入圖片說明

另外,您也可以替換gather()melt()reshape2substitute()為了能夠調用函數與不帶引號的變量:

DVGraph <- function (DV1, DV2) { 

  require(tidyr)
  require(reshape2)

  dfLong <- melt(df,measure.vars = c(substitute(DV1),substitute(DV2)),
                 var="prePost",value.name ="Score")

  require(ggplot2)

  barGraph <- ggplot(dfLong, aes(group, Score, fill = prePost)) + 
    geom_bar(stat = "identity", position = "dodge", size = 0.5) +
    scale_fill_manual(values = c("#999999", "#666666")) +
    xlab("") +
    ylab("Scores") +
    theme_bw()

  return(barGraph)

}

DVGraph(t1DV2, t2DV1)

更新:

如果你想要做您在您的評論問什么,一個快速解決的是認識到使用substitute()迫使你的載體是一個列表,但您可以強制其使用是一個字符as.character(substitute()) ,如下所示:

createFrame <- function (DV1, DV2) { 
  extractCols <- c("group", as.character(substitute(DV1)), as.character(substitute(DV2)))
  newFrame <- df[,extractCols]
  return(newFrame) 
}

createFrame(t1DV1, t2DV1) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM