对变量和sapply函数进行分组。

时间:2016-01-19 00:05:34

标签: r

这涉及最近关于使用函数计算标准误差的文章。以下代码有效。它是一个函数,用于将宽数据帧中的结果变量名称传递给函数,以便计算SE,以便最终在ggplot2条形图上添加为误差条。

首先创建数据

set.seed(1)

df <- data.frame(group = rep(c("group1", "group2", "group3", "group4"), 4), score1 = runif(16, 0, 10), score2 = runif(16, 3, 7))

然后编写该函数。 &#39; condGroup&#39;指定自变量&#39; group&#39;的级别。和&#39; colDV&#39;是感兴趣的结果变量的列名。

groupSEs <- function (condGroup, colDV) {
  SE <- sd(df[df$group == condGroup, colDV])/sqrt(nrow(df[df$group == condGroup,]))
  return(SE)
} 

接下来,在组变量

中创建所有级别名称的向量
groupSubset <- c("group1", "group2", "group3", "group4")

然后使用我们之前创建的函数将此向量传递给sapply

SE <- sapply(groupSubset, function(x) groupSEs(x, "score1"))

我们称之为

SE

我们得到此输出

group1   group2   group3   group4 
1.237912 1.733068 1.584986 1.533830 

这样有效。但是我的数据集中也有几个独立的分组变量,根据这些变量计算SE很不错。

所以我们再一次创建数据,但这次又添加了另一个分组变量。

set.seed(1)

df2 <- 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))

这次我们上面写的函数会有一个额外的参数,分组变量的名称&#39; IVGroup&#39;

groupSEs <- function (condGroup, IVGroup, colDV) {
  SE <- sd(df2[df2$IVGroup == condGroup, colDV])/sqrt(nrow(df2[df2$IVGroup == condGroup,]))
  return(SE)
}

现在我们创建关卡名称的向量

groupSubset <- c("group1", "group2", "group3", "group4")
groupSubset2 <- c("groupA", "groupB", "groupC", "groupD")

我们可以将其中任何一个传递给sapply函数。我选择了第二个

SE2 <- sapply(groupSubset2, function(x) groupSEs(x, "groupIV2", "score1"))

现在我称之为

SE

我明白了

groupA groupB groupC groupD 
    NA     NA     NA     NA 

那为什么我不能在第二个例子中使用那个额外的参数呢?

1 个答案:

答案 0 :(得分:0)

您的问题是,IVGroup变量包含以字符串形式存储的列名称,因此您无法使用$对其进行处理:您可以[, "colName"]代替您功能将是:

groupSEs <- function (condGroup, IVGroup, colDV) {
        SE <- sd(df2[df2[,IVGroup] == condGroup, colDV])/sqrt(nrow(df2[df2[,IVGroup] == condGroup,]))
        return(SE)
}