根据多个标准绘制整体百分比

时间:2013-03-28 18:21:07

标签: r plyr

更新: 如果有人想知道,两个答案都有效。它们都将实现一个汇总表,就像在Excel中模拟Sumif一样。这正是我所寻找的。再次感谢你们两位。

我有一个看起来像这样的数据框(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

我正在尝试按产品(a,b,c等)制作分面散点图。 我希望我的y轴为df$Classif,x轴为每个RevenueProductYr的百分比。 或者换句话说,给定某一年的产品总收入的百分比,每个分类是否占了?

我希望我的摘要框架看起来像......

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

在给定ProductClassifYr

的情况下,每个perc.rev最多可达100%

我试图使用以下代码获取我的摘要数据集/列:

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

结果数据框为ProductClassifYr提供了平均收入。我需要的是给定Classif产生的收入的百分比,与所有Classif相比 - ProductYear

我很确定我只需要帮助我的perc.rev公式或.variables的{​​{1}}部分。我习惯使用Excel并且通常会使用2个sumifs公式,但我不确定如何在R函数中表达我需要做的事情。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

为什么不执行使用ave(...,...,sum)添加副产品'总数'的双程流程,然后使用

添加by-Classif百分比
<strike>apply( ..., ..., function(x) x["Classif"]/x['total"] )<\strike>

编辑:(我还没弄明白这应该如何检查,但现在会尝试修复)第二部分太神秘了,可能只是错了。可能有可能将x [“Classif”]更改为x [“Revenue”],但我认为apply完全是错误的功能。

请求是“给定特定年份的产品总收入的百分比”,每个分类帐户是否为“...和”,其中每个perc.rev在产品,Classif和Yr的情况下总计达到100% ”。现在很明显,输出意味着至少第二部分应该读作“如果给定产品和年份,每个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

这会产生产品内部的总计,然后在这些分组中计算特定于分类的比例。