我有一个包含许多结果变量的数据库,只有几个分组变量。我正在编写一个图形函数,它允许我绘制IV和DV的许多不同组合,以便所有图形看起来都一样。该函数意味着为了生成新的图形,我只需要指定IV的名称,DV的名称以及图形的标签和标题。
我使用过'替代品'到目前为止效果很好但是遇到了试图计算标准误差的障碍。似乎sapply函数不允许将替换变量传递给它应用的函数。
我已经构建了一个简化版本的问题,以说明并寻求有关替代或替代的替代方案的帮助。
首先是玩具数据
set.seed(1)
df <- data.frame(groupIV1 = factor(rep(c("group1", "group2", "group3", "group4"), 4)),
groupIV2 = factor(rep(c("groupA", "groupB", "groupC", "groupD"), 4)),
score1 = runif(16, 0, 10),
score2 = runif(16, 3, 7))
现在计算每组标准错误的函数
groupSEs <- function (condGroup, IVGroup, colDV) {
SE <- sd(df[df[,IVGroup] == condGroup, colDV])/ sqrt(nrow(df[df[,IVGroup] == condGroup,]))
return(SE)
}
现在将两个分组变量中的所有级别命名为vector
groupSubset <- c("group1", "group2", "group3", "group4")
groupSubset2 <- c("groupA", "groupB", "groupC", "groupD")
使用此功能,我们可以使用多种IV和DV组合计算标准误差,如下所示:
SEsIV1DV1 <- sapply(groupSubset, function(x) groupSEs(x, "groupIV1", "score1"))
SEsIV1DV2 <- sapply(groupSubset, function(x) groupSEs(x, "groupIV1", "score2"))
SEsIV2DV1 <- sapply(groupSubset2, function(x) groupSEs(x, "groupIV2", "score1"))
SEsIV2DV2 <- sapply(groupSubset2, function (x) groupSEs(x, "groupIV2", "score2"))
这样可行。但是,如果我想将sapply函数放在另一个函数中,那么我只需要调用级别名称,IV名称和DV名称,如下所示:
applyGroupSE <- function (IVLevels, IVName, DVName) {
SError <- sapply(IVLevels, function(x) groupSEs(x, substitute(IVName), substitute(DVName)))
}
....当我称之为....
applyGroupSE(groupSubset, "groupIV1", "score1")
....它不起作用。我收到错误消息:
Error in x[j] : invalid subscript type 'symbol'
我认为这是因为某些原因而无法在sapply中工作的替代函数。
然而,它确实很适合其他功能。比如这种提取功能。
shrinkDF <- function (IVName, DVName) {
cols <- c(substitute(IVName), substitute(DVName))
newFrame <- df[,cols]
return(newFrame)
}
shrinkDF("groupIV1", "score2")
shrinkDF("groupIV2", "score1")
任何人都可以告诉我为什么&替换&#39;适用于后一种功能但不适用于使用sapply的功能以及我如何解决这个问题?