编辑:这个问题已经解决,因为当纠正错字时功能已经解决了。我更正了拼写错误,并将这个例子作为将来可能用于其他人的参考。答案中还提出了更有效的解决方案。
原帖(更正)帖子:
我希望能够创建一个函数,对数据的不同子集执行计算,使用逻辑运算符来定义子集。
我将使用包含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不会抱怨并且它工作正常。 (但请注意,当运行具有多个组的函数时,该函数将计算两个均值(或总计)的平均值。)
因此,将函数的变量放在逻辑运算符中会起作用,这与我在发布此问题时所认为的相反。
在下面提供的答案中,还有其他一些可能更优雅的方法来解决这类问题。
答案 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)