Расчет промежуточных итогов в R

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 и новичок в программировании. Это часть расходов депутата за определенный период времени. Я хочу подвести итоги расходов каждого члена парламента, и я использовал код из другого поста.

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

и отредактировал его под свою ситуацию.

мой код:

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

теперь, хотя этот код выполняет некоторую агрегацию, числа не совпадают. например, можно подсчитать, что расходы Адама Африи составляют 273,93 фунта стерлингов, однако этот код дает результат 12697. Я понятия не имею, что представляет собой это число. Может ли кто-нибудь помочь мне и сказать мне, что я делаю неправильно ??

заранее спасибо


person ATM    schedule 02.12.2010    source источник
comment
пожалуйста, не используйте специальные знаки в именах переменных. Теоретически R может справиться с ними, но они, как правило, преподносят некоторые сюрпризы. Кроме того, вам не нужно выполнять cbind(Amount)~Name.of.member, вы можете просто выполнить агрегат (Amount,Name.of.member,data=expenses,FUN=sum). Попробуйте это и посмотрите, есть ли у вас все еще неправильный номер   -  person Joris Meys    schedule 02.12.2010
comment
Можете ли вы опубликовать URL исходного файла данных?   -  person James    schedule 03.12.2010
comment
Возможно, ваша сумма считывается как фактор? Взгляд на str (foo) мог бы сказать вам наверняка.   -  person    schedule 04.12.2010


Ответы (3)


Используя только столбец имени и последний столбец суммы:

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
person mropa    schedule 02.12.2010

Я загрузил этот текст в редактор. Затем сделал действительные имена заголовков и вернул вкладки, которые, по-видимому, были заменены пробелами, и прочитал в 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(Amount ~ Name_of_member, data=MPexp, FUN=sum)
  Name_of_member  Amount
1   Adam Afriyie  273.93
2  Adam Holloway 3251.51
person IRTFM    schedule 02.12.2010

Другой подход с использованием 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
person Chase    schedule 03.12.2010