2015-08-20 3 views
0

У меня есть данные, которые содержат индекс и сезон и хотели бы дискретизировать эти данные. Я создал некоторые поддельные данные для демонстрации:Применение ifelse с переменной группировки

data_frame <- data.frame(index=c(10,233.2,12,44,56,232,1.4,43,76,89,20.3,23), season=c('Fall','Winter','Fall','Summer','Winter','Spring','Spring','Summer','Winter','Spring','Summer','Fall')) 
data_frame 
    index season 
1 10.0 Fall 
2 233.2 Winter 
3 12.0 Fall 
4 44.0 Summer 
5 56.0 Winter 
6 232.0 Spring 
7 1.4 Spring 
8 43.0 Summer 
9 76.0 Winter 
10 89.0 Spring 
11 20.3 Summer 
12 23.0 Fall 

Поскольку в моих исходных данных, распределение для каждого сезона отличается, я хотел бы Дискретизирую индекс группировку переменного сезона. Я дискретирую данные, назначая 1 для чего-либо выше 75-го процентиля для группы и 0 для чего-либо ниже.

Я хотел бы следующий вывод:

index season disc 
1 10.0 Fall 0 
2 233.2 Winter 1 
3 12.0 Fall 0 
4 44.0 Summer 1 
5 56.0 Winter 0 
6 232.0 Spring 1 
7 1.4 Spring 0 
8 43.0 Summer 0 
9 76.0 Winter 0 
10 89.0 Spring 0 
11 20.3 Summer 0 
12 23.0 Fall 1 

Я знаю, как найти результат, но не в том формате, что мне нужно. Я использую функцию tapply для Дискретизирую мои переменный:

tapply(data_frame$index, data_frame$season, function(x) ifelse(x>quantile(x,0.75),1,0)) 
$Fall 
[1] 0 0 1 

$Spring 
[1] 1 0 0 

$Summer 
[1] 1 0 0 

$Winter 
[1] 1 0 0 

Как бы произвести вывод, что мне нужно?

+0

'пр (data_frame $ индекс, data_frame $ сезон, FUN = функция (х) IfElse (x> quantile (x, 0,75), 1,0)) '? – Frank

+0

geez, я забыл про 'ave'. Не могли бы вы ответить на этот вопрос? – Michal

+0

Np, я вроде как подозреваю, что этот вопрос является обманом, поэтому я оставлю его в качестве комментария. Тем не менее, кто-то может свободно конвертировать его в ответ, если захочет. Я бы предложил заняться 'dplyr' или' data.table', если вам нужно часто делать групповые вещи. – Frank

ответ

1

Вы можете использовать dplyr:

library(dplyr) 
data_frame %>% group_by(season) %>% 
       mutate(disc = +(percent_rank(index) > 0.75)) 

    index season disc 
1 10.0 Fall 0 
2 233.2 Winter 1 
3 12.0 Fall 0 
4 44.0 Summer 1 
5 56.0 Winter 0 
6 232.0 Spring 1 
7 1.4 Spring 0 
8 43.0 Summer 0 
9 76.0 Winter 0 
10 89.0 Spring 0 
11 20.3 Summer 0 
12 23.0 Fall 1 

редактировать с помощью + для преобразования TRUEFALSE в Numberic согласно Frank

+1

Целое число лучше числового для двоичного var, а? Fwiw, '+ x' можно использовать вместо' as.integer (x) 'для более низкого балла по коду. – Frank

+0

То же решение с использованием исходной функции data_frame%>% group_by (сезон)%>% mutate (диск = ifelse (index> quantile (index, 0.75), 1,0)) –

+1

'+' немного патологический - отлично! – jeremycg

Смежные вопросы