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

嗨即时通讯新的R和新的编程。这是特定时间段内议员开支的一部分。我想小计每个议员的费用,我用另一个职位的代码计算小计在R

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

并编辑它到我自己的情况。

我的代码:

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

现在虽然这个代码做一些汇总的数量不匹配。例如可以计算出Adam Afriyie的开支是273.93英镑,但是这个代码给出了12697的结果。我不知道这个数字代表什么。有人可以帮助我,告诉我什么我做错了吗?

预先感谢您

+3

请不要在变量名中使用特殊符号。理论上R可以处理它们,但它们倾向于给出一些意外。另外,你不需要做cbind(Amount)〜Name.of.member,你可以做聚合(Amount,Name.of.member,data = expenses,FUN = sum)。尝试一下,看看你是否仍然有错误的号码 – 2010-12-02 16:36:13

回答

1

只用你的名字列,你最后的量柱:

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

版本1

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

版本2

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

输出:

1 Adam Afriyie 273.93 
2 Adam Holloway 3251.51 
2

我将该文本拖入编辑器。然后做出有效的头名,并放回那明显是被替换为空格选项卡和读成R得到这个对象:

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

现在,这应该与骨料产生预期的效果:

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

阅读你的问题再次让我意识到你正在使用aggregate.formula所以这也将在这些数据的工作:

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

另一种方法使用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