2010-12-02 8 views
2
Name of member Allowance Type    Expenditure Type Date   Amount, £ 

Adam Afriyie Office running costs (IEP/AOE) Incidentals  07/03/2009 111.09 
Adam Afriyie Office running costs (IEP/AOE) Incidentals  11/05/2009 111.09 
Adam Afriyie Office running costs (IEP/AOE) Incidentals  11/05/2009 51.75 
Adam Holloway Office running costs (IEP/AOE) Incidentals 10/01/2009 35 
Adam Holloway Office running costs (IEP/AOE) Incidentals 10/01/2009 413.23 
Adam Holloway Office running costs (IEP/AOE) Incidentals 10/01/2009 9.55 
Adam Holloway Office running costs (IEP/AOE IT equipment 07/03/2009 890.01 
Adam Holloway Communications Expenditure Publications 12/04/2009 1774 
Adam Holloway Office running costs (IEP/AOE) Incidentals 12/08/2009 1.1 
Adam Holloway Office running costs (IEP/AOE Incidentals 12/08/2009 64.31 
Adam Holloway Office running costs (IEP/AOE) Incidentals 12/08/2009 64.31 

Salut im nouveau à R et nouveau à la programmation. C'est un sous-ensemble des dépenses du député pendant une certaine période. Je veux le sous-total des dépenses de chaque MP et je l'ai utilisé le code d'un autre posteCalcul des sous-totaux dans R

> aggregate(cbind(bsent, breturn, tsent, treturn, csales) ~ yname, data = foo, 
+   FUN = sum) 

et à ma propre edited situation.

mon code:

expenses2 <- aggregate(cbind(Amount..Â.) ~ Name.of.member, data = expenses, FUN = sum) 

maintenant bien que ce code fait faire une sorte d'agrégation les chiffres ne correspondent pas. par exemple on peut calculer que les dépenses d'Adam Afriyie sont £ 273.93 cependant ce code donne un résultat de 12697. Je n'ai aucune idée de ce que représente ce nombre. Quelqu'un peut-il m'aider et me dire ce que je fais mal?

Merci à l'avance

+3

Veuillez ne pas utiliser de signes spéciaux dans les noms de variables. Théoriquement, R peut traiter avec eux, mais ils ont tendance à donner quelques surprises. De plus, vous n'avez pas besoin de faire cbind (Amount) ~ Name.of.member, vous pouvez simplement faire agrégat (Amount, Name.of.member, data = dépenses, FUN = somme). Essayez cela et voir si vous avez toujours un mauvais numéro –

+0

Pouvez-vous poster l'URL du fichier de données d'origine? – James

+0

Peut-être que votre montant est lu en tant que facteur? Un regard sur str (foo) serait en mesure de vous dire à coup sûr. –

Répondre

1

En utilisant seulement votre colonne nom et votre dernière colonne Montant:

df <- data.frame(name = c(rep("Adam Afriyie", 3), rep("Adam Holloway", 8)), 
       amount = c(111.09, 111.09, 51.75, 35, 
        413.23, 9.55, 890.01, 1774, 1.1, 64.31, 64.31) 
       ) 

Version 1

aggregate(df$amount, by = list(name = df$name), FUN = "sum") 

Version 2

aggregate(amount ~ name, data = df, FUN = "sum") 

sortie:

1 Adam Afriyie 273.93 
2 Adam Holloway 3251.51 
2

J'ai extrait ce texte dans un éditeur. Puis en noms d'en-tête valides et remettre les onglets qui avaient apparemment été remplacés par des espaces et lire en R obtenir cet objet:

MPexp <- structure(list(Name_of_member = c("Adam Afriyie", "Adam Afriyie", 
    "Adam Afriyie", "Adam Holloway", "Adam Holloway", "Adam Holloway", 
    "Adam Holloway", "Adam Holloway", "Adam Holloway", "Adam Holloway", 
    "Adam Holloway"), Allowance_Type = c("Office running costs (IEP/AOE)", 
    "Office running costs (IEP/AOE)", "Office running costs (IEP/AOE)", 
    " Office running costs (IEP/AOE)", " Office running costs (IEP/AOE)", 
    " Office running costs (IEP/AOE)", " Office running costs (IEP/AOE", 
    " Communications Expenditure", " Office running costs (IEP/AOE)", 
    " Office running costs (IEP/AOE", " Office running costs (IEP/AOE)" 
    ), Expenditure_Tyoe = c("Incidentals", "Incidentals", "Incidentals", 
    "Incidentals", "Incidentals", "Incidentals", "IT equipment", 
    "Publications", "Incidentals", "Incidentals", "Incidentals"), 
     Date = c("07/03/09", "11/05/09", "11/05/09", "10/01/09", 
     "10/01/09", "10/01/09", "07/03/09", "12/04/09", "12/08/09", 
     "12/08/09", "12/08/09"), Amount = c(111.09, 111.09, 51.75, 
     35, 413.23, 9.55, 890.01, 1774, 1.1, 64.31, 64.31)), .Names = c("Name_of_member", 
    "Allowance_Type", "Expenditure_Tyoe", "Date", "Amount"), 
class = "data.frame", row.names = c(NA, 
    -11L)) 

Maintenant, cela devrait donner le résultat attendu avec un agrégat:

> aggregate(MPexp$Amount, MPexp["Name_of_member"], sum) 
    Name_of_member  x 
1 Adam Afriyie 273.93 
2 Adam Holloway 3251.51 

lecture votre question m'a fait à nouveau réaliser que vous utilisiez aggregate.formula donc cela fonctionnerait également sur ces données:

> aggregate(Amount ~ Name_of_member, data=MPexp, FUN=sum) 
    Name_of_member Amount 
1 Adam Afriyie 273.93 
2 Adam Holloway 3251.51 
1

Une autre approche utilisant plyr

library(plyr) 

#Using data from mropa's answer 
> ddply(df, .(name), summarise, sum = sum(amount)) 
      name  sum 
1 Adam Afriyie 273.93 
2 Adam Holloway 3251.51