2014-08-29 7 views
4

je la trame de données suivantes:Les rendements cumulés avec NA de R dans

df <- data.frame(Return1=c(NA, NA, .03, .04, .05), 
      Return2=c(.25, .33, NA, .045, .90), 
      Return3=c(.04, .073, .08, .04, .01)) 


    Return1 Return2 Return3 
1  NA 0.250 0.040 
2  NA 0.330 0.073 
3 0.03  NA 0.080 
4 0.04 0.045 0.040 
5 0.05 0.900 0.010 

Je voudrais calculer les rendements cumulatifs, mais il y a des valeurs manquantes dans la trame de données. Je:

cumprod(df+1)-1 

Obtenir un résultat

Return1 Return2 Return3 
1  NA 0.2500 0.0400000 
2  NA 0.6625 0.1159200 
3  NA  NA 0.2051936 
4  NA  NA 0.2534013 
5  NA  NA 0.2659354 

Le problème ici est que s'il y a une NA, les lignes suivantes vers le bas aura comme résultat NA. Existe-t-il un moyen de calculer les rendements cumulés sans NA affectant le reste des lignes ci-dessous?

Je voudrais obtenir un résultat:

Return1 Return2 Return3 
1  NA 0.2500 0.0400000 
2  NA 0.6625 0.1159200 
3 0.03  NA 0.2051936 
4 0.07120 0.7373 0.2534013 
5 0.12476 2.3008 0.2659354 

Je sais d'une fonction dans le paquet PerformanceAnalytics appelé Return.cumulative, mais cela n'obtenir le rendement cumulatif d'une des colonnes entières.

Des idées?

Répondre

5
cumpfun <- function(x){ 
    x[!is.na(x)] <- cumprod(x[!is.na(x)]+1)-1 
    x 
} 
sapply(df,cumpfun) 

#  Return1 Return2 Return3 
# [1,]  NA 0.2500000 0.0400000 
# [2,]  NA 0.6625000 0.1159200 
# [3,] 0.03000  NA 0.2051936 
# [4,] 0.07120 0.7373125 0.2534013 
# [5,] 0.12476 2.3008937 0.2659354 

Notez que sapply renvoie une matrice. Si vous avez besoin d'une trame de données, vous pouvez utiliser sth comme as.data.frame(lapply(df, cumpfun))

+0

J'essayais d'utiliser une méthode 'na.omit', mais celle-ci est très bonne. (+1) –

+0

Comment est-ce qu'on porterait ceci au code C? Quelques fondements dans le [code source xts pour runSum traitant des NAs principaux] (https://github.com/R-Finance/xts/search?utf8=%E2%9C%93&q=firstNonNA). Intéressé à écrire runProd dans C. Toute indication @JoshuaUlrich? –

Questions connexes