使用'替代品' sapply

时间:2016-01-19 09:10:45

标签: r sapply

我有一个包含许多结果变量的数据库,只有几个分组变量。我正在编写一个图形函数,它允许我绘制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的功能以及我如何解决这个问题?

0 个答案:

没有答案