更新: 如果有人想知道,两个答案都有效。它们都将实现一个汇总表,就像在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轴为每个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
在给定Product
,Classif
和Yr
我试图使用以下代码获取我的摘要数据集/列:
df.perc <- ddply(df, .(Product, Classif, Yr), summarise,
perc.rev = sum(Revenue)/count(Classif))
结果数据框为Product
,Classif
和Yr
提供了平均收入。我需要的是给定Classif
产生的收入的百分比,与所有Classif
相比 - Product
和Year
我很确定我只需要帮助我的perc.rev公式或.variables
的{{1}}部分。我习惯使用Excel并且通常会使用2个sumifs公式,但我不确定如何在R函数中表达我需要做的事情。
答案 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)
添加副产品'总数'的双程流程,然后使用
<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
这会产生产品内部的总计,然后在这些分组中计算特定于分类的比例。