2010-12-02 14 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 

Hallo ich bin neu in R und neu in der Programmierung. Dies ist eine Teilmenge der Ausgaben des MP während eines bestimmten Zeitraums. Ich möchte, dass jeder Abgeordnete Aufwendungen Zwischensumme und i verwendet den Code aus einem anderen BeitragZwischensummen berechnen in R

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

und bearbeitet es auf meine eigene Situation.

mein Code:

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

jetzt obwohl dieser Code eine Art von Aggregation macht die Zahlen nach oben nicht übereinstimmen. zum Beispiel kann man berechnen, dass die Ausgaben von Adam Afriyie £ 273,93 sind, aber dieser Code ergibt ein Ergebnis von 12697. Ich habe keine Ahnung, was diese Zahl darstellt. Kann mir jemand helfen und mir sagen, was ich falsch mache?

Vielen Dank im Voraus

+3

Bitte verwenden Sie keine Sonderzeichen in Variablennamen. Theoretisch kann R mit ihnen umgehen, aber sie neigen dazu, einige Überraschungen zu geben. Außerdem müssen Sie nicht cbind (Amount) ~ Name.of.member eingeben, Sie können nur aggregieren (Amount, Name.of.member, data = expenses, FUN = sum). Versuchen Sie das und sehen Sie, ob Sie immer noch eine falsche Nummer haben –

+0

Können Sie die URL der ursprünglichen Datendatei posten? – James

+0

Vielleicht wird Ihr Betrag als Faktor eingelesen? Ein Blick auf str (foo) könnte Ihnen sicher sagen. –

Antwort

1

nur Ihren Namen Spalte und die letzte Menge Spalte:

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") 

Ausgang:

1 Adam Afriyie 273.93 
2 Adam Holloway 3251.51 
2

Ich zog diesen Text in einen Editor. Dann machte gültigen Header-Namen und die Registerkarten zurücklegen, die scheinbar mit Leerzeichen ersetzt worden war und lesen Sie in R bekommen dieses Objekt:

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)) 

Nun sollte dies das erwartete Ergebnis mit Aggregat ergeben:

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

Lesen Ihre Frage wieder machte mir klar, dass Sie aggregate.formula wurden mit so diese auch auf diesen Daten arbeiten würde:

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

Ein weiterer Ansatz 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 
Verwandte Themen