Я пытаюсь в R указать, в каком квинтиле значение переменной для каждого месяца моего фрейма данных в этом случае основано на волатильности. За каждый месяц я хочу знать для каждого запаса, если он находится в наиболее волатильном квинтиле, если он находится в одном из других.R: Назначение переменной для квинтиля на ежемесячной основе
До сих пор я придумал следующую функцию (см. Ниже). К сожалению, функция работает только в некоторых случаях и часто дает следующее сообщение об ошибке:
Error in cut.default(df$VOLATILITY, unique(breaks), label = FALSE, na.rm =TRUE):
invalid number of intervals
Не могли бы вы дать мне несколько советов о том, как улучшить этот код так, что он работает должным образом.
Это относительно срочно. Большое спасибо!
quintilesVolByMonth <- function(x){
months<-as.vector(unique(x$DATE))
dfx<-data.frame()
for(n in seq(1,length(months))){
num<-5
print(paste("Appending month",months[n],sep=""))
df<-subset(x,DATE==months[n])
breaks<-quantile(df$VOLATILITY,probs=seq(0,1, 1/num),na.rm=TRUE)
df$volquintile <- cut(df$VOLATILITY,unique(breaks),
label=FALSE, na.rm=TRUE)
dfx<-rbind(dfx,df)
}
return(dfx)
}
Frame.Quintile <- quintilesVolByMonth(x)
ПРИМЕР ДАННЫХ: Последний столбец - это то, что я пытаюсь получить. Данные здесь - всего лишь пример, а не фактические результаты.
> DATE <- c("01/10/2011","01/10/2012","01/10/2010","01/08/2010","01/10/2011","01/12/2011","01/09/2011","01/10/2011","01/09/2012","01/08/2012","01/02/2010","01/01/2011","01/09/2010","01/06/2010","01/07/2010","01/01/2012","01/01/2012","01/11/2011","01/09/2011","01/10/2011")
> NAME<-c("HOEK'S MACHINE DEAD - DELIST.","WORLD SCOPE (CADB TEST STOCK)","BRILL (KON.)", "BBL DEAD - 30/06/465", "GENK LOGISTICS","GROENIJK.YLCBN. DEAD - DELIST.31/05/479", "NOORD-EUR.HOUTH.","PALTHE DEAD - 4/2/475","GENERALE BANQUE DEAD - DEL. 30/12/490","STORK DEAD - TAKEOVER 905099","LOUVAIN-LA-NEUVE","VENTOS DEAD - 06/06/384","BRAINE-LE-COMTE SUSP 14/02/460","VILENZO DEAD - 25/11/370","ECONOSTO KON. DEAD - 07/07/374","ELECTRORAIL DEAD - DELIST 21/02/387","BLYSTEIN FL.1384","OBOURG (CIMENTS)","BRUGEFI DEAD - 31/07/475","GIB NEW")
> VOLATILITY<-c(0.3383, 0.084, 0.046, 0.0945, 0.0465, 0.2008, 0.1361, 0.2183, 0.1032, 0.1083, 0.0494, 0.0538, 0.0357, 0.037, 0.0386, 0.073, 0.073, 0.0393, 0.0687, 0.3308)
> VOLQUINTILE<-c(4,1,1,2,2,3,2,3,4,2,3,2,4,1,2,1,1,2,3,4)
>
> x<-data.frame(DATE,NAME,VOLATILITY, VOLQUINTILE)
> x
DATE NAME VOLATILITY VOLQUINTILE
1 01/10/2011 HOEK'S MACHINE DEAD - DELIST. 0.3383 4
2 01/10/2012 WORLD SCOPE (CADB TEST STOCK) 0.0840 1
3 01/10/2010 BRILL (KON.) 0.0460 1
4 01/08/2010 BBL DEAD - 30/06/465 0.0945 2
5 01/10/2011 GENK LOGISTICS 0.0465 2
6 01/12/2011 GROENIJK.YLCBN. DEAD - DELIST.31/05/479 0.2008 3
7 01/09/2011 NOORD-EUR.HOUTH. 0.1361 2
8 01/10/2011 PALTHE DEAD - 4/2/475 0.2183 3
9 01/09/2012 GENERALE BANQUE DEAD - DEL. 30/12/490 0.1032 4
10 01/08/2012 STORK DEAD - TAKEOVER 905099 0.1083 2
11 01/02/2010 LOUVAIN-LA-NEUVE 0.0494 3
12 01/01/2011 VENTOS DEAD - 06/06/384 0.0538 2
13 01/09/2010 BRAINE-LE-COMTE SUSP 14/02/460 0.0357 4
14 01/06/2010 VILENZO DEAD - 25/11/370 0.0370 1
15 01/07/2010 ECONOSTO KON. DEAD - 07/07/374 0.0386 2
16 01/01/2012 ELECTRORAIL DEAD - DELIST 21/02/387 0.0730 1
17 01/01/2012 BLYSTEIN FL.1384 0.0730 1
18 01/11/2011 OBOURG (CIMENTS) 0.0393 2
19 01/09/2011 BRUGEFI DEAD - 31/07/475 0.0687 3
20 01/10/2011 GIB NEW 0.3308 4
воспроизводимый пример пожалуйста? –
Я согласен с Беном. Помните, что если вы когда-либо применяете этот код к средним/большим объемам данных, он будет очень медленным. Создание пустого фрейма данных, а затем 'rbind'ing штук на нем в целом будет очень неэффективным. – joran
Я добавил пример. Какой метод, по вашему мнению, будет более эффективным joran? – user2251017