加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

按多个因子级别计算多列和聚合值

发布时间:2020-12-14 04:48:49 所属栏目:百科 来源:网络整理
导读:我的数据如下: 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 <- 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).我可以在我的方法中看到一个结构,所以我想知道是否有更优雅的解决方案,或者已经有一些功能可以促进这种任务.

解决方法

你可以试试dplyr

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读