2012-11-20 3 views
1

J'ai une base de données qui contient les valeurs du PIB par pays avec une colonne de date d'accompagnement. Le code suivant reproduit un ensemble de données de l'échantillon pour deux pays (FR et DE) et six ans (2005-2010):Calculer les pourcentages de changement dans les données "longues"

df <- structure(list(geo = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 
       2L, 2L, 2L, 2L, 2L), .Label = c("DE", "FR"), class = "factor"), 
       date = structure(c(12784, 13149, 13514, 13879, 14245, 14610, 
       12784, 13149, 13514, 13879, 14245, 14610), class = "Date"), 
       GDP = c(2147975, 2249584.4, 2373993.1, 2382892.6, 2224501.8, 
       2371033.2, 1557584.8, 1621633.2, 1715655.4, 1713157.1, 1636336.3, 
       1707966.5)), .Names = c("geo", "date", "GDP"), row.names = c(NA, 
       -12L), class = "data.frame") 

Maintenant, je voudrais calculer une colonne supplémentaire qui montre le pourcentage année des différences sur l'année. Je les opérations suivantes:

library(quantmod) 
# provides the Delt() function to calculate percent differences 

df$dtGDP <- as.numeric(Delt(df$GDP)) 

Ceci est erroné, car il calcule une valeur pour FR en 2005 en utilisant le DE-valeur de 2010. Est-il possible d'appliquer la fonction « par niveau de facteur »?

+1

Ceci est une question très typique "split-apply-combiner" à laquelle vous trouverez probablement réponses abondantes sur SO. – BenBarnes

+0

@BenBarnes Encore j'ai aimé la réponse DWin ci-dessous! – Ali

+0

En fait, @BenBarnes est probablement correct. Si vous recherchez "tapply" et "ave" vous trouverez probablement beaucoup d'exemples qui sont très similaires à la mienne. (D'un autre côté vous trouverez beaucoup d'exemples travaillés avec des fonctions de plyr-package qui sont essentiellement isomorphes l'une par rapport à l'autre et à celle-ci.) –

Répondre

4
> df$dtGDP <-with(df, ave(GDP, geo, FUN=Delt)) 
> df 
    geo  date  GDP  dtGDP 
1 DE 2005-01-01 2147975   NA 
2 DE 2006-01-01 2249584 0.047304741 
3 DE 2007-01-01 2373993 0.055302971 
4 DE 2008-01-01 2382893 0.003748747 
5 DE 2009-01-01 2224502 -0.066469970 
6 DE 2010-01-01 2371033 0.065871558 
7 FR 2005-01-01 1557585   NA 
8 FR 2006-01-01 1621633 0.041120329 
9 FR 2007-01-01 1715655 0.057979943 
10 FR 2008-01-01 1713157 -0.001456178 
11 FR 2009-01-01 1636336 -0.044841655 
12 FR 2010-01-01 1707966 0.043774742 
+0

Excellent! J'ai joué en deux lignes et vous l'avez fait en commande unique – Ali

2

Essayez ceci:

foo <- aggregate(GDP~geo, df, function(x) list(Delt(x))) 
df <- cbind(df, dtGDP = as.numeric(unlist(foo[,-1]))) 
df 

En supposant que vous avez déjà exécuté ceci:

library(quantmod) 
df <- structure(list(geo = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 
       2L, 2L, 2L, 2L, 2L), .Label = c("DE", "FR"), class = "factor"), 
       date = structure(c(12784, 13149, 13514, 13879, 14245, 14610, 
       12784, 13149, 13514, 13879, 14245, 14610), class = "Date"), 
       GDP = c(2147975, 2249584.4, 2373993.1, 2382892.6, 2224501.8, 
       2371033.2, 1557584.8, 1621633.2, 1715655.4, 1713157.1, 1636336.3, 
       1707966.5)), .Names = c("geo", "date", "GDP"), row.names = c(NA, 
       -12L), class = "data.frame") 
Questions connexes