首页 > 解决方案 > 基于R中特定类别的其他列以百分比计算列

问题描述

我是 R 的初学者,需要帮助完成任务。带有 dput 的虚拟数据集的输出(真实集合非常大):

structure(list(CODE = c(453, 463, 476, 
798, 885, 582, 626, 663, 457, 408
), CATEGORY = c("CIG", "BET", "CIG", "CIG", "ARI", "CRR", "ARI", "CIG", 
"CIG", "BET"), AMOUNT = c(22, 5, 6, 52, 16, 11, 6, 70, 208, 5), 
    PRICE = c(5.56, 8.29, 3.89, 3.8, 4.05, 3.99, 3.55, 7.69, 6.75, 
    5.2), BRAND = c("ROTHMANS", "ALLINO", "MARLBORO", "ROTHMANS", "AURIELO", 
    "SOLINOS", "CHLEBLO", "MARLBORO", "LD", "SOLINOS"
    )), row.names = c(NA, -10L), class = c("tbl_df", 
"tbl", "data.frame"))

应该做什么:应该添加一个列,以百分比显示每个品牌的份额。首先我所做的是以这种方式创建一个新列“VALUE”:

df$VALUE <- with(df, AMOUNT*PRICE)

现在必须以这样的方式创建 SHARE 列:特定类别中特定品牌的值总和(来自列 VALUE)除以整个类别的值总和。例如,“ROTHMANS”属于 CIG 类别,它的值总和是 319.92,整个 CIG 类别的总和是 2285,56,因此,SHARE=14%。并且应该在每种情况下进行计算。我认为 dplyr 库可以是合适的,但找不到解决方案。

标签: rdataframedplyrcalculated-columns

解决方案


您可以先取值并获取每个 的sum比例。BRANDCATEGORY

library(dplyr)

df %>%
  group_by(CATEGORY, BRAND) %>%
  summarise(VALUE = sum(VALUE)) %>%
  mutate(SHARE = prop.table(VALUE) * 100) %>%
  ungroup

#  CATEGORY BRAND     VALUE SHARE
#  <chr>    <chr>     <dbl> <dbl>
#1 ARI      AURIELO    64.8  75.3
#2 ARI      CHLEBLO    21.3  24.7
#3 BET      ALLINO     41.4  61.5
#4 BET      SOLINOS    26    38.5
#5 CIG      LD       1404    61.4
#6 CIG      MARLBORO  562.   24.6
#7 CIG      ROTHMANS  320.   14.0
#8 CRR      SOLINOS    43.9 100  

推荐阅读