2015-02-13 2 views
4

Ниже приведен сценарий для создания воспроизводимой dataframe:как рассчитать среднее значение с условиями?

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», когда -40 = < a < 0; и каково среднее значение «b», когда 0 = < a < = 40.

спасибо!

+0

Что такое 'coef'? –

+0

Спасибо, Бира, это решение также помогает – cyrusjan

ответ

2

Вот быстрое 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 диапазон ограничен, вы можете сделать это быстро с базой R слишком

sapply(split(df, df$a >= 0), function(x) mean(x$b)) 
#  FALSE  TRUE 
# 33.96727 89.46000 
+0

Может быть, '% между%' также может быть использовано. – akrun

+0

Да, я думал об этом, проблема в том, что условия не равны. LHS является '<=' и RHS является '<' ... –

+0

Я думал, что «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

Или используя 'dplyr'' sumize (df, MeanASmall = mean (b [-40 <= a & a <0]), Среднее значение ABig = среднее (b [0 <= a & a <= 40])) ' – akrun

+0

I также не думаю, что есть какая-то польза для 'which' здесь –

+0

@David Arenburg: вы правы !, Я изменил его сейчас. –