2012-06-25 3 views
1

Je travaille sur un R data.frame qui est fait des dividendes d'actions par an (j'ai 60 stocks dans les colonnes et le calendrier habituel dans les rangées). Quand un dividende est payé, j'ai le chiffre et sinon il y a un NA.R Tri des données par date

En gros, voici comment mon data.frame ressemble

  BARC LN  BARN SE BAS GY BATS LN 
1999-01-01  0.26  NA  NA 
1999-01-02  NA  0.56  0.35  NA 
1999-01-03  NA  NA  NA  NA 
2000-01-04  NA  NA  0.40  NA 
1999-01-05  0.23  0.28  NA  NA 
2001-01-06  NA  NA  NA  NA 
2001-01-07  0.85  NA  0.15  NA 

Je voudrais obtenir le montant du dividende payé par année pour chaque stock afin de calculer le taux de rendement du dividende et enfin obtenir une données ; cadre comme celui ci-dessous:

  BARC LN BARN SE BAS GY BATS LN 
    1999  NA  NA  NA  NA 
    2000  NA  NA  NA  NA 
    2001  NA  NA  NA  NA 

Comment puis-je faire cela?

+1

Qu'avez-vous essayé? Il semble que vos dates soient 'row.names'?pouvez-vous utiliser 'dput' pour publier un sous-ensemble de vos données réelles. Cela rendra beaucoup plus facile de vous donner une réponse correcte. – Justin

+0

voici ce que j'ai essayé, mais il ne me donne pas les dividendes en actions car je n'ai que les dates: années <-as.POSIXlt (Dates) $ année + 1900 Div [, 1] [qui (années == 2000)] – marino89

+0

désolé, Div est le data.frame qui contient toutes mes données – marino89

Répondre

2

Donc, en supposant que vos données sont dans un data.frame comme celui que vous avez posté ci-dessus appelé div:

div <- structure(list(barc.ln = c(0.26, NA, NA, NA, 0.23, NA, 0.85), 
    barn.se = c(NA, 0.56, NA, NA, 0.28, NA, NA), bas.gy = c(NA, 
    0.35, NA, 0.4, NA, NA, 0.15), bats.ln = c(NA, NA, NA, NA, 
    NA, NA, NA)), .Names = c("barc.ln", "barn.se", "bas.gy", 
"bats.ln"), row.names = c("1999-01-01", "1999-01-02", "1999-01-03", 
"2000-01-04", "1999-01-05", "2001-01-06", "2001-01-07"), class = "data.frame") 

comme vous l'avez fait, vous pouvez extraire les années de votre row.names:

div$years <- as.POSIXlt(row.names(div))$year + 1900 

Les paquets plyr et reshape2 fonctionnent bien ici et je pense que le code est particulièrement clair. Plus précisément, je vais utiliser melt pour rendre les données à long puis ddply de se scinder en groupes et sum les dividendes:

library(plyr) 
library(reshape2) 
div.melt <- melt(div, id.vars='years') 
div.sum <- ddply(div.melt, 
       .(years, variable), 
       summarise, 
       dividend = sum(value, na.rm=TRUE)) 

> div.sum 
years variable dividend 
1 1999 barc.ln  0.49 
2 1999 barn.se  0.84 
3 1999 bas.gy  0.35 
4 1999 bats.ln  0.00 
5 2000 barc.ln  0.00 
6 2000 barn.se  0.00 
7 2000 bas.gy  0.40 
8 2000 bats.ln  0.00 
9 2001 barc.ln  0.85 
10 2001 barn.se  0.00 
11 2001 bas.gy  0.15 
12 2001 bats.ln  0.00 
> 

vous pouvez alors utiliser une autre fonction de reshape2 appelé cast pour formater vos données « large »:

> dcast(div.sum, years ~ variable, value.var='dividend') 
    years barc.ln barn.se bas.gy bats.ln 
1 1999 0.49 0.84 0.35  0 
2 2000 0.00 0.00 0.40  0 
3 2001 0.85 0.00 0.15  0 
> 
+0

Cette fonction ne fonctionne pas: dividends.sum <-ddply (dividendes.melt,. (Années, variable), résumer, dividende = somme (value, na.rm = TRUE)) et le message erro est: eero dans sum (valeur, na.rm = TRUE): 'type' (caractère) incorrect ..... – marino89

+0

@ user1474263 cela fonctionne si vous utilisez les données J'ai fourni. Si vous utilisez la fonction 'dput' pour nous donner une copie reproductible de votre code, alors je peux vous aider. L'erreur suggère que vous essayez de calculer la somme d'un vecteur de caractères, ce qui n'est bien sûr pas possible. Mais il n'y a aucun moyen pour moi d'aider au débogage sans voir certaines de vos données dans un format utilisable. – Justin

1

Je pense que vous pouvez le faire assez facilement en utilisant par(). Voici comment je l'ai fait. J'ai mis chaque bloc, avec une explication ci-dessous chaque bloc.

dividends <- data.frame(barc_ln=c(0.26,NA,NA,NA,0.23,NA,0.85), 
         barn_se=c(NA,0.56,NA,NA,0.28,NA,NA), 
         bas_gy=c(NA,0.35,NA,0.40,NA,NA,0.15), 
         bats_ln=c(NA,NA,NA,NA,NA,NA,NA), 
         row.names=c("1999-01-01","1999-01-02","1999-01-03","2000-01-04","1999-01-05","2001-01-06","2001-01-07")) 

Ceci crée simplement la trame de données d'origine que vous avez donnée.

dividends[,"dates"] <- as.Date(row.names(dividends)) 
dividends <- dividends[order(dividends[,"dates"]),] 
dividends[,"year"] <- format(dividends$dates,"%Y") 

Cela prend les dates nom de ligne, puis les transforme en une nouvelle colonne (« dates ») dans le cadre de données. Ensuite, nous ordonnons la trame de données (pas nécessairement obligatoire, mais je la trouve plus intuitive) par date et extraire l'année (en tant que personnage, attention à vous) en utilisant le format.

div_output <- data.frame(row.names=unique(dividends$year)) 

Ensuite, je crée la trame de données de sortie qui recevra les données. J'utilise la fonction unique() sur la variable year pour obtenir le vecteur unique des années. Ils sont déjà commandés (un avantage de la commande de la trame de données). En utilisant une simple boucle, nous passons simplement par chacune des colonnes et appliquons la fonction by(). La variable est la colonne, les indices sont l'année, et nous utilisons simplement la fonction sum. Je tague na.rm = TRUE pour qu'au lieu de NAs, vous obteniez des données réelles.

print(div_output) 

    barc_ln barn_se bas_gy bats_ln 
1999 0.49 0.84 0.35  0 
2000 0.00 0.00 0.40  0 
2001 0.85 0.00 0.15  0 

Et il y a la sortie que je reçois.