2012-01-04 5 views
0

Приносим извинения за продвинутый вопрос, но это не вопрос, но я смотрел на форуме и не смог найти способ поиска того, что я пытаюсь сделать. У меня есть тренировочный набор, и я пытаюсь найти способ уменьшить количество уровней, которые у меня есть для своих категориальных переменных. (В приведенном ниже примере категория - это состояние). Я хотел бы сопоставить состояние со средним или уровнем уровня. Мой обучающий набор будет выглядеть следующим образом когда-то вход в кадр данных:Создайте агрегатный столбец на основе переменных с помощью R

state class mean 
1  CA  1 0 
2  AZ  1 0 
3  NY  0 0 
4  CA  0 0 
5  NY  0 0 
6  AZ  0 0 
7  AZ  1 0 
8  AZ  0 0 
9  CA  0 0 
10  VA  1 0 

Я хотел бы третий столбец в моем кадре данных будет среднее значение первого столбца (состояние) на основе переменной класса. поэтому среднее значение для строк CA будет 0.333 ... , так что средний столбец можно использовать в качестве замены для столбца состояния Есть ли хороший способ сделать это без записи явного цикла в R?

Как осуществить сопоставление новых уровней (например, новых состояний), если мой набор для обучения не включил их? Любая ссылка на подходы в R будет с большой благодарностью.

ответ

2

Это действительно то, для чего была предназначена функция ave. Это действительно может быть использован для построения какого-либо функционального результата по категориям, но по умолчанию Funciton подло отсюда и название, то есть, ave- (ярость):

dfrm$mean <- with(dfrm, ave(class, state)) #FUN=mean is the default "setting" 
+0

Я принял этот ответ, потому что он не требует, чтобы я использовал внешний пакет. Не могли бы вы отменить состояние и класс в своем ответе? ex: с (dfrm, ave (класс, состояние)) – ak3nat0n

1
library(plyr) 
    join(data,ddply(data,.(state),summarise,mean=mean(class)),by=("state"),type="left") 
+0

Я думаю, что это может быть проще использовать 'ddply' и 'transform' (если я правильно понял OP). – joran

+0

На самом деле я просто сделал резюме, но сопоставил его с исходными данными. Я подозреваю, что только заявление ddply достаточно, но OP может быть частью исходных данных. – Maiasaura