2015-06-29 6 views
0

В Calculating percentiles by factor using ave() in r я спросил, как вычислить процентили в пределах функции ave(). С завершением этой задачи я столкнулся с более сложной задачей.Расчет AVERAGEIF в R по уровню фактора

Возьмите следующие данные:

DistrictName   Building Name X2.Yr.AVG  Thirty   Seventy 
Ionia Public Schools Emerson   -0.337464323 -0.196387489 -0.046524185 
Ionia Public Schools Jefferson  -0.318673587 -0.196387489 -0.046524185 
Ionia Public Schools Ionia Middle -0.290854669 -0.196387489 -0.046524185 
Ionia Public Schools Ionia Middle -0.288202752 -0.196387489 -0.046524185 
Ionia Public Schools Twin Rivers El -0.23426755  -0.196387489 -0.046524185 
Ionia Public Schools R.B. Boyce El -0.202319963 -0.196387489 -0.046524185 
Ionia Public Schools Twin Rivers El -0.142995221 -0.196387489 -0.046524185 
Ionia Public Schools Emerson   -0.141620372 -0.196387489 -0.046524185 
Ionia Public Schools Jefferson  -0.141407078 -0.196387489 -0.046524185 
Ionia Public Schools R.B. Boyce El -0.115530249 -0.196387489 -0.046524185 
Ionia Public Schools Ionia Middle -0.111449269 -0.196387489 -0.046524185 
Ionia Public Schools Twin Rivers El -0.054918339 -0.196387489 -0.046524185 
Ionia Public Schools Jefferson  -0.045591501 -0.196387489 -0.046524185 
Ionia Public Schools A.A. Rather  0.002251298  -0.196387489 -0.046524185 
Ionia Public Schools R.B. Boyce El 0.020669633  -0.196387489 -0.046524185 
Ionia Public Schools Emerson   0.065064968  -0.196387489 -0.046524185 
Ionia Public Schools A.A. Rather  0.182776319  -0.196387489 -0.046524185 

То, что я пытаюсь сделать что-то похожее на то, что AVERAGEIF функции в Excel. В Excel я могу сказать =AVERAGEIF(C2:C18, "<-.196387489"), который выплескивает среднее значение -0.278630474. Мне нужно что-то в R, которое позволяет мне сделать следующее: я хочу создать новые переменные для среднего значения: 1) любые значения X2.Yr.AVG, которые меньше значения Thirty 2) любые значения, которые больше, чем Значение Seventy

Уловка заключается в том, что мне нужно выполнить эту операцию в большом кадре данных с 722 уровнями для коэффициента DistrictName. На этапе расчета процентилей, я использовал функцию ave() для создания процентилей в соответствии с требуемым коэффициентом следующим образом:

MATHgap$Thirty<-ave(MATHgap$X2.Yr.AVG, MATHgap$DistrictName, 
     FUN= function(x) quantile(x, 0.3)) 

и

MATHgap$Seventy<-ave(MATHgap$X2.Yr.AVG, MATHgap$DistrictName, 
     FUN= function(x) quantile(x, 0.7)) 

Есть ли способ сделать что-то похожее на СРЕБ в ave(), чтобы операция повторялась для каждого значения DistrictName независимо от других? I.e, государственные школы Ionia должны иметь среднее значение для меньше -0.196387489 и для X2.Yr.AVG больше, чем -0.046524185, и я хочу иметь возможность выполнять ту же функцию для всех районов, используя их соответствующие значения для , Thirty и Seventy.

Если это сбивает с толку, извини.

+0

'по формуле (X2.Yr.AVG, MATHgap $ DistrictName, функция (х) {р = квантиль (х, с (0.3, 0.7)); среднее (x [(x> p [1] & x

Vlo

ответ

1

Вот решение с использованием dplyr:

MATHgap %>% 
    group_by(DistrictName) %>% 
    mutate(MeanLT30 = mean(X2.Yr.AVG[X2.Yr.AVG < Thirty]), 
    MeantGT70 = mean(X2.Yr.AVG[X2.Yr.AVG > Seventy]))