2016-01-14 1 views
0

I ont une trame de données qui ressemble à ceci:R: Somme des valeurs conditionnelles et variables sur la valeur des autres variables

year country inhabitants 
1 1  A   15 
2 2  A   10 
3 3  A   24 
4 1  B   76 
5 2  B   69 
6 3  B   58 
7 1  C   120 
8 2  C   131 
9 3  C   128 

Maintenant, je voudrais créer la somme des « habitants » pour chaque année, sur l'ensemble des pays. à savoir, ma solution ressemblerait à ceci:

year country inhabitants sum_inhabitants 
1 1  A   15    211 
2 2  A   10    210 
3 3  A   21    207 
4 1  B   76    211 
5 2  B   69    210 
6 3  B   58    207 
7 1  C   120    211 
8 2  C   131    210 
9 3  C   128    207 

Mon cadre de données d'origine contient beaucoup d'autres observations, ce qui est la raison pour laquelle je ne peux pas faire le calcul à la main.

+0

Ce serait génial si vous pouviez fournir un exemple reproductible minimum pour accompagner votre question. Quelque chose que nous pouvons travailler et utiliser pour vous montrer comment il pourrait être possible de répondre à votre question. De cette façon, d'autres peuvent également s'adapter à votre question, et la réponse qui l'accompagne, dans le futur. Vous pouvez jeter un coup d'œil à [ce post SO] (https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) sur comment faire un grand exemple reproductible en R Aussi, veuillez décrire ce que vous avez déjà essayé. –

+0

@EricFail chercher une dupe différente sans cumul des sommes –

Répondre

0

Nous pouvons utiliser ave pour additionner par année sans avoir besoin de paquets extérieurs. L'avantage qu'il a sur aggregate est qu'il ne résumera pas, mais plutôt remplir en ligne:

df$sum_inhabitants <- ave(df$inhabitants, df$year, FUN=sum) 
# year country inhabitants sum_inhabitants 
# 1 1  A   15    211 
# 2 2  A   10    210 
# 3 3  A   21    207 
# 4 1  B   76    211 
# 5 2  B   69    210 
# 6 3  B   58    207 
# 7 1  C   120    211 
# 8 2  C   131    210 
# 9 3  C   128    207 
+0

Parfait, merci beaucoup! Existe-t-il un moyen d'ignorer les NA dans les «habitants»? – Theresa

+0

Oui. 'ave (df $ habitants, df $ année, FUN = fonction (x) somme (x, na.rm = T))' –

0

En utilisant dplyr package, vous pouvez faire quelque chose comme ceci:

library(dplyr) 
df %>% group_by(year) %>% summarise(sum_inhabitants = sum(inhabitants)) 

Si vous voulez vraiment Conservez les doublons dans cette colonne et ajoutez-les au bloc de données d'origine, remplacez summarise ci-dessus par mutate, et cela vous donnera la sortie exacte que vous avez spécifiée ci-dessus.

Si vous voulez l'obtenir par année et par pays, vous pouvez le faire:

df %>% group_by(year, country) %>% summarise(sum_inhabitants = sum(inhabitants))