我有一个包含多个因变量但只有两个独立变量的大型数据集(我将反复使用它来对许多因变量进行排序)。每个因变量在治疗前和治疗后测量两次。我想编写一个函数,允许我为这些多个因变量中的每一个获取一个图形,函数的参数作为我希望绘制的任何因变量的两个列名。
我已经生成了一个玩具数据集来说明我的问题。 '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")
但是我得到了另一个(不同的)错误。
有谁知道我怎么会这样做?
答案 0 :(得分:1)
将gather
来电更改为以下内容:
dfLong <- gather(df, prePost, Score, DV1, DV2)
然后,当您调用函数时,请使用列号而不是列名:
DVGraph(2, 3)
或者,您可以将gather()
替换为melt()
reshape2
substitute()
,以便能够使用未加引号的变量调用该函数:
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()
强制您的矢量成为一个列表,但您可以使用{{{{}}强制它成为一个字符1}}如下:
as.character(substitute())