如何在满足条件的情况下计算平均值?

4
以下是生成可重现数据框的脚本:
id <- c(1:20)
a <- as.numeric(round(runif(20,-40,40),2))
b <- as.numeric(round(a*1.4+60,2))
df <- as.data.frame(cbind(id, a, b))

我希望计算在不同的"a"条件下,"b"的平均值。比如说,在-40 ≤ a < 0时,"b"的平均值是多少;而在0 ≤ a ≤ 40时,"b"的平均值又是多少呢?谢谢!

谢谢Bira,那个解决方案也很有帮助。 - cyrusjan
2个回答

4

以下是一个快速的 data.table 解决方案(假定 coefa

library(data.table)
setDT(df)[, .(MeanASmall = mean(b[-40 <= a & a < 0]),
              MeanABig = mean(b[0 <= a & a <= 40]))]
#    MeanASmall MeanABig
# 1:   33.96727    89.46

如果范围受限,您也可以使用基本的R语言快速完成此操作。
sapply(split(df, df$a >= 0), function(x) mean(x$b))
#     FALSE     TRUE 
#  33.96727 89.46000 

也许 %between% 也可以被使用。 - akrun
是的,我想过了,问题在于条件不相等。LHS 是 <= 而 RHS 是 < ... - David Arenburg
我之前以为 incbounds 可以改变,但你是对的。 - akrun

4
以下解决方案可以实现这一点:
子集
ndf1<-subset(df, a>=-40 & a<=0)
ndf2<-subset(df, a>=0 & a<=40)

mean(ndf1[,3])
mean(ndf2[,3])

或者更简单

mean(df[a>=-40 & a<=0, 3]) 
mean(df[a>=0 & a<=40, 3]) 

使用ddply

library(plyr)
ddply(df, .(a>=-40 & a<=0), summarize, mean=mean(b))
ddply(df, .(a>=0 & a<=40), summarize, mean=mean(b))

1
或者使用 dplyrsummarise(df, MeanASmall = mean(b[-40 <=a & a <0]), MeanABig= mean(b[0 <=a & a <=40])) - akrun
我也认为在这里使用 which 没有任何用处。 - David Arenburg
@David Arenburg:你是对的!我现在已经改了。 - Ruthger Righart

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接