r - 多列计算和多因子水平聚合值

标签 r

我的数据如下所示:

df <- data.frame(Price=seq(1, 1.5, 0.1),
                 Sales=seq(6, 1, -1),
                 Quality=c('A','A','A','B','B','B'),
                 Brand=c('F','P','P','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, data=df, 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')

enter image description here

应该有更好的方法来绘制此图,但我的主要兴趣是获取中间结果较少的数据框(Revenue、RevSumByQ、RevSumWithinQByB)。我可以在我的方法中看到一个结构,所以我想知道是否有更优雅的解决方案,或者已经有一些函数可以促进此类任务。

最佳答案

您可以尝试dplyr

res <- df %>%
         group_by(Quality) %>% 
         mutate(Revenue= Price*Sales,RevSumByQ=sum(Revenue)) %>% 
         group_by(Brand) %>% 
         mutate(RevSumWithinQByB= sum(RevSumByQ),
             RevDistWithinQByB= RevSumByQ/RevSumWithinQByB ) 

关于r - 多列计算和多因子水平聚合值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27639479/

相关文章:

r - 设置 na dplyr 环境中以特定字符串开头的所有值 is.na()、na_if()、startsWith()、regex

r - 基准测试:使用 `expression` `quote` 或都不使用

在 Windows 上运行 R 并尝试访问 Linux 文件

r - 通过仅选择前一行中大于某个数字的递增值来设置子集

r - 使用 "{{"运算符通过环境变量隧道数据变量

r - 按row.name和column合并

r - 将特殊字符分数转换为 R 中的实际数值

r - 使用 Rselenium 在下拉框中选择选项

r - clmm后如何使用texreg(我想提取随机效应成分)

r - 如何更改base R' cut获得的输出格式?