如何计算条件均值?
how to calculate the mean with conditions?
下面是生成可重现数据帧的脚本:
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))
我想计算 "b" 在 "a" 的不同条件下的平均值。
例如,当 -40 =< a < 0 时,"b" 的平均值是多少;当 0=< a <=40 时,"b" 的平均值是多少?
非常感谢!
这是一个快速的 data.table
解决方案(假设 coef
是 a
)
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
如果a
范围有限,你也可以用 base R 快速做到这一点
sapply(split(df, df$a >= 0), function(x) mean(x$b))
# FALSE TRUE
# 33.96727 89.46000
以下解决方案可以做到:
子集
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))
下面是生成可重现数据帧的脚本:
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))
我想计算 "b" 在 "a" 的不同条件下的平均值。 例如,当 -40 =< a < 0 时,"b" 的平均值是多少;当 0=< a <=40 时,"b" 的平均值是多少?
非常感谢!
这是一个快速的 data.table
解决方案(假设 coef
是 a
)
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
如果a
范围有限,你也可以用 base R 快速做到这一点
sapply(split(df, df$a >= 0), function(x) mean(x$b))
# FALSE TRUE
# 33.96727 89.46000
以下解决方案可以做到:
子集
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))