【问题标题】:Display ranges and sum until the condition is met显示范围和总和,直到满足条件
【发布时间】:2019-07-05 04:22:57
【问题描述】:

我有一个 excel 文件,它有两列,第一列是针对客户的,第二列是从他们那里产生的收入。假设我的总收入是 1000。我需要将这个总收入分成 5 个桶,即总收入的 20%(0-200)、总收入的 40%(200-400)、总收入的 60%( 400-600)、总收入的 80% (600-800) 和总收入的 100% (800-1000)。我想计算每个桶范围内的客户数量,例如,有多少客户位于收入总和

 Customer   Revenue
    a          230
    b          170
    c          809
    d          435
    e          678
    f          350
    g          465
    h          990
    i          767
    j          500

【问题讨论】:

  • 因为从您的示例中不清楚。您是否想让您的客户按收入排序,因此收入最少的客户属于总收入

标签: r plot sum range


【解决方案1】:

原始数据:

df <- tibble(Customer = letters[1:10], Revenue = c(230, 170, 809, 435, 678, 350, 465, 990, 767, 500))

library(dplyr)
library(ggplot2)

按收入升序对 data.frame 进行排序

df <- df %>% 
  arrange(Revenue)

使用 R base 中的 cut() 函数添加一个变量,该变量显示累积的收入位于 5 个 bin 中的哪一个。然后使用 x 轴绘制 bin,使用 y 轴绘制该分类变量的值数。

    df %>% 
      mutate(Revenue_Cumulated = cumsum(Revenue)/sum(Revenue)) %>% 
      mutate(bins = cut(Revenue_Cumulated, breaks = seq(0, 1, 0.2))) %>% 
      group_by(bins) %>% 
      summarise(n = n()) %>% 
      mutate(cumulated_n = cumsum(n)) %>% 

    # data.frame at that point in the code:
    # A tibble: 5 x 3
    #  bins          n cumulated_n
    #  <fct>     <int>       <int>
    # 1 (0,0.2]       3           3
    # 2 (0.2,0.4]     3           6
    # 3 (0.4,0.6]     1           7
    # 4 (0.6,0.8]     1           8
    # 5 (0.8,1]       2          10

    gather(key, value, -bins) %>% 
    ggplot(aes(x = bins, y = value, fill = key)) +
    geom_col(position = "dodge")+
    geom_text(aes(label=value),position=position_dodge(width=0.9),vjust=-0.25)

cumulated_n 现在将显示有多少客户对 0-X 百分比做出了贡献。收集函数用于将数据转换为更长的格式,这使得将“n”和“cumulated_n”视为突出图表差异的因素变得更容易。

Number_customers_by_bin

【讨论】:

  • 感谢您的快速回复!在上述解决方案中,每家公司的收入都表示为总收入的百分比,并基于您划分的垃圾箱。取而代之的是,是否可以只计算收入的累计总和,并在此基础上计算位于总收入前 20%、40%、60%、80% 和 100% 的客户数量。所以,我们需要按降序排列数据,然后进行累积求和,并在此基础上显示介于 0-20%、20-40% 之间的客户数量,依此类推。我怎样才能做到这一点?
  • 形式上我认为它是相同的,但是在arrange()函数中,将Revenue包装在desc中以获得你想要的:arrange(desc(Revenue)):第一个bin代表客户的数量代表前 20%。
  • 它给了我 0-20%、20%-40%、40%-60% 等的客户数量。但是,我想查看 0-20%、0-40%(包括 0-20%+20%-40% 的客户)、0-60%(包括 0 -40% + 40%-60%) 等等。
【解决方案2】:

您可以直接绘制收入的直方图,R 为您进行分箱:

Revenue <- c(230, 170, 809, 435, 678, 350, 465, 990, 767, 500)
hist(Revenue, breaks = seq(0, 1000, 200))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-22
    • 1970-01-01
    • 2017-05-29
    • 1970-01-01
    • 2019-11-07
    • 1970-01-01
    相关资源
    最近更新 更多