替换函数内逻辑运算符中的变量

时间:2014-04-02 14:53:21

标签: r function logical-operators

编辑:这个问题已经解决,因为当纠正错字时功能已经解决了。我更正了拼写错误,并将这个例子作为将来可能用于其他人的参考。答案中还提出了更有效的解决方案。

原帖(更正)帖子:
我希望能够创建一个函数,对数据的不同子集执行计算,使用逻辑运算符来定义子集。

我将使用包含2个组(" A"和" B")的数据框为您提供简化示例,每个组包含2个变量:

df <- data.frame(matrix(0, ncol = 2, nrow = 4))
colnames(df) <- c("group","var")
df$group <- c("A","B")
df$var <- c(1,4,1,4)

计算,例如不同组A和B的平均值,可以使用逻辑运算符==对数据进行子集化:

==

这对于少数几个组来说当然很容易,但是如果你有一个更大的数据集,那么能够创建一个计算几个不同组的平均值的函数会很方便(提供这些组的名称)例子以矢量的形式)。构建这样一个函数的想法(显然是不对的)看起来像这样:

>mean(df$var[df$group=="A"])
[1] 1
>mean(df$var[df$group=="B"])
[1] 4

并且这样运行,以获得两组A和B的手段:

autoMean <- function (q) {
mean(df$var[df$group==q])
}

现在,当我定义函数时R不会抱怨并且它工作正常。 (但请注意,当运行具有多个组的函数时,该函数将计算两个均值(或总计)的平均值。)

因此,将函数的变量放在逻辑运算符中会起作用,这与我在发布此问题时所认为的相反。

在下面提供的答案中,还有其他一些可能更优雅的方法来解决这类问题。

4 个答案:

答案 0 :(得分:3)

也许您正在寻找tapply

tapply(X=df$var, INDEX=df$group, FUN=mean)
# A B 
# 1 4

答案 1 :(得分:3)

更加流畅的方法是使用dplyr()包。

library(dplyr)
summarise(group_by(df, group), 
          meanValue = mean(var))

答案 2 :(得分:3)

此外:

aggregate(var ~ group, data=df, FUN=mean)
library(plyr)
ddply(df, .(group), summarize, mean=mean(var))
### add column with mean of each group
cbind(df, with(df, ave(var, group)))

小心调用df调用package:stats中默认加载的F分布。

答案 3 :(得分:1)

我认为您的原始函数定义中存在拼写错误。这可能导致你的错误 - 尝试这个吗?

 autoMean <- function (df, q) {
    mean(df$var[df$group==q])
    return(data.frame(q = q, mean= mean(df$var[df$group==q]) ))
  }

  groups<-c("A","B")
results <- lapply(groups, autoMean, df = df)