2014-09-11 4 views
1

В моей работе нередко есть непрерывный вектор, который нужно «дискретировать». То, что я хочу сделать, это заменить значения непрерывной переменной, которая была дискретизирована cut со средним значением другой переменной по этим диапазонам разреза.Создайте вектор средних замещенных значений на основе другого вектора

EDIT

Кроме того, среднее (или любой другой функции я хочу использовать для генерации значения) должны быть основаны на исходных данных и применять к новым данным. Представьте себе ситуацию, когда я вычисляю средние плохие показатели для непрерывной переменной в наборе учебных данных, создаю модель и затем должен применять эту же логику преобразования к новым данным.

END EDIT

Рассмотрим следующие данные:

x <- rnorm(100) 
x.disc <- cut(x, c(-Inf, -2, 0, 2, Inf)) 
lookup <- aggregate(x, list(x.disc), mean) 

> lookup 
    Group.1   x 
1 (-Inf,-2] -2.2322429 
2 (-2,0] -0.6968720 
3  (0,2] 0.8671428 
4 (2, Inf] 2.6696064 

То, что я хотел бы сделать, это создать новый вектор, x1, где значение равно х значения в подстановок при исходные значения x попадают в соответствующий диапазон. Мой ожидается выход вектор будет выглядеть следующим образом:

> head(x) 
[1] -0.1867972 1.7309683 -0.1306331 1.2787303 0.8388222 -0.4449465 

Желаемая Выход:

> head(x1) 
[1] -0.6968720 0.8671428 -0.6968720 0.8671428 0.8671428 -0.6968720 

В pandas для python есть группы по применить парадигму, которая использует transform транслировать агрегированные значения обратно в то же измерение, что и вход. Есть ли что-то подобное для R? Я хотел бы сохранить его в базовых функциях для моего понимания, но я не против использования других пакетов.

+1

Вы просто хотите 'AVE (х, x.disc, FUN = среднее)'? (так что не используйте поиск) – user20650

+0

Или может быть 'lookup $ x [match (x.disc, lookup $ Group.1)]' – akrun

+0

да, спасибо за предложения. Я должен уточнить (и сделаю это в редактировании), что мне нужно будет применить любое преобразование, которое я придумаю для новых данных. Поэтому я должен как-то сохранить информацию о поиске, чтобы впоследствии использовать ее. – Zelazny7

ответ

1

Вы можете попробовать:

x.disc <- cut(x, c(-Inf, -2, 0, 2, Inf), labels=FALSE) 
    lookup <- aggregate(x, list(x.disc), mean) 
    lookup$x[x.disc]