2013-03-28 2 views
2

Обновление: Если кому-то интересно, оба ответа работают. Они оба получат сводную таблицу, как и вы создавали бы, если бы имитировали Sumifs в Excel. Это именно то, что я искал. Еще раз спасибо вам обоим.Графический процент от целого на основе нескольких критериев

У меня есть фрейм данных (df), который выглядит примерно так, но с большим количеством продуктов. df$Yr основан на дату отсечки> = 3/2012

Product  Classif   Yr  Revenue 
a   paid_yes  TRUE  25 
a   paid_yes  TRUE  20 
a   paid_yes  TRUE  35 
a   paid_yes  FALSE 20 
a   paid_yes  FALSE 30 
a   paid_yes  FALSE 30 
a   paid_partial TRUE  15 
a   paid_partial TRUE  15 
a   paid_partial FALSE 18 
a   leased  TRUE  12 
a   leased  TRUE  12 
a   leased  FALSE 14 
a   Other   TRUE  27 
a   Other   FALSE 30 
a   Other   TRUE  25 
a   Other   FALSE 22 
a   Other   TRUE  32 
a   Other   FALSE 30 
a   Other   TRUE  24 
a   Other   FALSE 27 
b   paid_yes  TRUE  45 
b   paid_yes  FALSE 32 
b   paid_yes  TRUE  35 
b   paid_yes  FALSE 39 
b   paid_partial FALSE 42 
b   paid_partial FALSE 45 
b   paid_partial TRUE  47 
b   paid_partial FALSE 33 
b   paid_partial FALSE 28 
b   leased  TRUE  48 
b   leased  FALSE 46 
b   leased  FALSE 45 
b   leased  TRUE  37 
b   leased  FALSE 33 
b   leased  TRUE  46 
b   leased  FALSE 44 
b   Other   TRUE  49 
b   Other   FALSE 45 
b   Other   TRUE  43 
b   Other   FALSE 39 

Я пытаюсь сделать фаска график рассеяния, побочный продукт (а, б, в и т.д.). Я хочу, чтобы моя ось y была df$Classif, а ось x составляла в общей сложности Revenue по Product, в пределах каждого Yr. Или, другими словами, какой процент от общей выручки от продукта за определенный год составляет каждый классификационный аккаунт?

Я хочу, чтобы мое резюме кадра выглядеть примерно так ...

Product  Classif   Yr  perc.rev 
a   paid_yes  TRUE  .332 
a   paid_partial TRUE  .123 
a   leased  TRUE  .099 
a   Other   TRUE  .446 

Где каждый perc.rev добавляет до 100% дали Product, Classif и Yr

Я попытался получить мой набор сводных данных/столбец со следующим кодом:

df.perc <- ddply(df, .(Product, Classif, Yr), summarise, 
       perc.rev = sum(Revenue)/count(Classif)) 

Полученный кадр данных дает мне средний доход Product, Classif, и Yr. Что мне нужно процента дохода, порождённая Classif, по сравнению с ALL Classif - по Product и Year

Я уверен, что я просто нужна помощь с моей perc.rev формулой или раздел .variablesddply. Я привык к Excel и обычно использовал 2 формулы sumifs, но не уверен, как выразить то, что мне нужно сделать здесь, в функции R.

+0

Приведен ли пример из этих данных? Если да, то как вы точно вычислили 0,332 (a, paid_yes, TRUE)? –

+0

Я создал набор данных, расположенный сверху, а затем вычислил кадр вывода/сводной информации в Excel с помощью sumifs. :) Я на самом деле нажал на 2 в .332 – wesmantooth

+0

Но какими будут числа и операции ... Я не вижу, где это .332 произошло из –

ответ

1

Почему бы не сделать процесс два прохода, который добавляет побочного продукта «общей» с помощью ave(...,...,sum), а затем процент по-объявл с

<strike>apply(..., ..., function(x) x["Classif"]/x['total"])<\strike> 

Редактировать: (Я не понял, как это заслуживает проверки, но теперь попытается исправить). Эта вторая часть была слишком загадочной и, вероятно, просто неправильной. Возможно, было возможно исправление изменения x ["Classif"] до x ["Доход"], но я думаю, что apply был неправильной функцией вообще.

Запрос был «за какой процент от общей выручки за продукт, предоставленный в течение определенного года, делает ли каждый классификационный счет« ... »и« где каждый perc.rev составляет до 100% с учетом Продукта, Класса и Yr».Теперь ясно, что вывод подразумевает, что, по крайней мере, эта вторая часть должна была прочитать «Где каждый perc.rev добавляет до 100% с учетом продукта и года». (исключая Classif).

dfrm$total <- ave(dfrm$Revenue, dfrm$Product, dfrm$Yr, FUN=sum) 
dfrm$prod.yr.prop <- dfrm$Revenue/dfrm$total 
aggregate(dfrm$prod.yr.prop, list(class=dfrm$Classif, Yr=dfrm$Yr, Prod=dfrm$Product), FUN=sum) 
      class Yr Prod   x 
1  leased FALSE a 0.06334842 
2   Other FALSE a 0.49321267 
3 paid_partial FALSE a 0.08144796 
4  paid_yes FALSE a 0.36199095 
5  leased TRUE a 0.09917355 
6   Other TRUE a 0.44628099 
7 paid_partial TRUE a 0.12396694 
8  paid_yes TRUE a 0.33057851 
9  leased FALSE b 0.35668790 
10  Other FALSE b 0.17834395 
11 paid_partial FALSE b 0.31422505 
12  paid_yes FALSE b 0.15074310 
13  leased TRUE b 0.37428571 
14  Other TRUE b 0.26285714 
15 paid_partial TRUE b 0.13428571 
16  paid_yes TRUE b 0.22857143 

Это делает внутри-продукт-YR на общую сумму, а затем вычисляет объявл-specificproportion внутри этих групп.

+0

Действительно, вот более элегантное решение :-) Не знал функцию 'ave'. Ура! –

+0

Да. 'tapply' сгладит функциональные результаты по категориям, но' ave' позволяет вам распространять информацию по каждой записи в категориях. –

+0

@DWin - У меня возникли проблемы с передачей правильных аргументов в ave. Я предполагаю, что вы имеете в виду что-то вроде «total <- ave (df $ Product, df $ Yr, sum)» и затем подключаете это к функции «apply()». Но опять же, вы, вероятно, не потому, что это приводит к ошибке:) Не могли бы вы рассказать о том, как вы это сделаете? – wesmantooth

2

Я новичок в plyr, поэтому может быть более элегантное решение. Сначала сохраните общий счетчик для каждой комбинации (Product, Yr). Затем запустите ddply:

counts <- ddply(df, .(Product, Yr), summarise, count=sum(Revenue)) 
ddply(df, .(Product, Classif, Yr), summarise, 
    perc.rev=sum(Revenue)/counts$count[counts$Product==Product[1] & counts$Yr==Yr[1]]) 

Что дает

Product  Classif Yr perc.rev 
1  a  leased FALSE 0.06334842 
2  a  leased TRUE 0.09917355 
3  a  Other FALSE 0.49321267 
4  a  Other TRUE 0.44628099 
5  a paid_partial FALSE 0.08144796 
6  a paid_partial TRUE 0.12396694 
7  a  paid_yes FALSE 0.36199095 
8  a  paid_yes TRUE 0.33057851 
9  b  leased FALSE 0.35668790 
10  b  leased TRUE 0.37428571 
11  b  Other FALSE 0.17834395 
12  b  Other TRUE 0.26285714 
13  b paid_partial FALSE 0.31422505 
14  b paid_partial TRUE 0.13428571 
15  b  paid_yes FALSE 0.15074310 
16  b  paid_yes TRUE 0.22857143 
+0

Я пытаюсь решить ваше решение, но не уверен в отношении второй части. Когда вы выполняете задание 'counts', я получаю понятный результат (спасибо вам за это, я вижу, что сам это очень много). Однако я не уверен, как использовать вторую функцию ddply - и я получаю странный результат. Результат выглядит как '1 арендованный FALSE 0.06334842', но под каждой классификацией дублируется запись NA. '2 арендованный FALSE NA' – wesmantooth

+0

Nevermind, просто нужно было наклеить на' na.exclude'! Но у меня есть еще один вопрос о аргументах подмножества 'Product [1]' и 'Yr [1]'. Что такое 1 ссылка? – wesmantooth

+0

Для того, что я видел, 'Product' и' Yr' имеют столько элементов, сколько комбинация в data.frame. Например, '(a, paid_yes, TRUE)' появляется 3 раза. Если вы удалите '[1]', он выдает несколько предупреждений о том, что вы сравниваете множество элементов одновременно. Использование '[1]' просто использует первый (два других одинаковы) –