2015-08-20 76 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 

因爲在我的原始數據,每個季節的分佈是不同的,我想在賽季變量離散指數分組。我通過給組中的第75個百分點分配一個1來分配數據,而將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

'AVE(data_frame $指數,data_frame $季節,FUN =函數(X)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編輯數字小按弗蘭克

+1

Integer比二進制var的數字要好,呃? Fwiw,'+ x'可以代替'as.integer(x)'代替更低代碼的高爾夫分數。 – Frank

+0

使用原始函數data_frame%>%group_by(season)%>%mutate(disc = ifelse(index> quantile(index,0.75),1,0))的相同解決方案) –

+1

'+'略有病態 - 很棒! – jeremycg

相關問題