我的数据如下:
df <- data.frame(Price=seq(1,1.5,0.1),Sales=seq(6,1,-1),Quality=c('A','A','B','B'),Brand=c('F','P','F','F'))
有时我需要对多个列进行一些复杂的计算,并按多个因子级别聚合值.举一个简单的例子,如果我想在每个质量中获得收入(=价格*销售)分布并按品牌划分,我会这样做
df$Revenue <- df$Price*df$Sales RevSumByQ <- aggregate(Revenue~Quality,data=df,sum) colnames(RevSumByQ)[2] <- "RevSumByQ" df <- merge(df,RevSumByQ) RevSumWithinQByB <- aggregate(RevSumByQ~Brand,sum) colnames(RevSumWithinQByB)[2] <- "RevSumWithinQByB" df <- merge(df,RevSumWithinQByB) df$RevdistWithinQByB = df$RevSumByQ/df$RevSumWithinQByB df Brand Quality Price Sales Revenue RevSumByQ RevSumWithinQByB RevdistWithinQByB 1 F A 1.0 6 6.0 16.3 32.7 0.4984709 2 F B 1.4 2 2.8 8.2 32.7 0.2507645 3 F B 1.5 1 1.5 8.2 32.7 0.2507645 4 P A 1.1 5 5.5 16.3 40.8 0.3995098 5 P A 1.2 4 4.8 16.3 40.8 0.3995098 6 P B 1.3 3 3.9 8.2 40.8 0.2009804
如果在情节中显示:
require(ggplot2) ggplot(data=df,aes(x=Brand,y=RevdistWithinQByB,fill=Quality)) + geom_bar(stat='identity')
应该有更好的方法来绘制这个图,但我的主要兴趣是获得具有较少中间结果的数据框(Revenue,RevSumByQ,RevSumWithinQByB).我可以在我的方法中看到一个结构,所以我想知道是否有更优雅的解决方案,或者已经有一些功能可以促进这种任务.