按日期分组的R中的复数加权平均值

时间:2019-12-19 01:10:24

标签: r

我有一个包含多个产品的数据集(示例中为3个,实际为200个),每个产品都有一定的折扣,并且属于特定日期的某个位置。折扣可以改变,以及商品的位置和价值。

import { Router, ActivatedRoute, ParamMap } from "@angular/router";
////
constructor(public partDetailsService: PartDetailsService
    ,         public companyService: CompanyService, public route: ActivatedRoute)
////
this.route.params.subscribe((params: ParamMap) => {
                const Partid = Convert.StringToInt(params['Partid']);
});

我正在计算每个日期每个位置的加权平均折扣。

例如,在Date Item Discount Value Location 12/16/2019 AAA 4% 10000 BP1 12/17/2019 AAA 5% 11000 BP1 12/16/2019 AAA 6% 11500 BP2 12/16/2019 AAC 3% 10000 BP1 12/17/2019 AAC 4% 11000 BP1 12/16/2019 AAC 12% 13000 BP3 12/16/2019 BBC 12% 13500 BP3 12/17/2019 BBC 3% 11000 BP2 12/16/2019 BBC 1% 9000 BP1 上,12/16/2019W.BP1中的加权平均折扣)为:BP12.72%

结果如下:

Value of each item in PB1 divided by sum of the values, multiplied by the respective discount, then summed up

我可以在excel中完成几行和几个位置,但是需要找到一种R的方式。 预先谢谢你

2 个答案:

答案 0 :(得分:4)

dplyr是实现并可视化此效果的好方法:

library(dplyr)
dat %>%
  mutate(Discount = as.numeric(gsub("[^0-9.]", "", Discount))/100) %>%
  group_by(Date, Location) %>%
  summarize(Weighted.Discount = sum(Discount * Value/sum(Value))) %>%
  ungroup()
# # A tibble: 5 x 3
#   Date       Location Weighted.Discount
#   <chr>      <chr>                <dbl>
# 1 12/16/2019 BP1                 0.0272
# 2 12/16/2019 BP2                 0.06  
# 3 12/16/2019 BP3                 0.12  
# 4 12/17/2019 BP1                 0.045 
# 5 12/17/2019 BP2                 0.03  

DateDiscount都处于“分类”模式。如果打算分析性地使用它们(按日期排序,计算差异,乘以数值等),则需要将它们转换为“适当的” R对象。我上面已经转换了Discount,但是您可以用类似的方式转换Date

  mutate(Date = as.Date(Date, format = "%m/%d/%Y")) %>%

(在管道的其余部分内)。

我还假设美国数字中的“点”使用正则表达式[0-9.]来表示小数部分;例如,如果您的语言环境使用逗号,则可以将其更改为[0-9,]


数据:

dat <- read.table(header = TRUE, stringsAsFactors = FALSE, text = "
Date        Item    Discount    Value   Location
12/16/2019  AAA     4%          10000   BP1
12/17/2019  AAA     5%          11000   BP1
12/16/2019  AAA     6%          11500   BP2
12/16/2019  AAC     3%          10000   BP1
12/17/2019  AAC     4%          11000   BP1
12/16/2019  AAC     12%         13000   BP3
12/16/2019  BBC     12%         13500   BP3
12/17/2019  BBC     3%          11000   BP2
12/16/2019  BBC     1%          9000    BP1")

答案 1 :(得分:1)

如果您对data.table方法感兴趣:

data.table(data.table)


dt[, Discount := as.numeric(gsub("[^0-9.]", "", 
    Discount))/100][, .(Weighted.Discount = sum(Discount * Value/sum(Value))), 
    by = .(Date, Location)]

#          Date Location Weighted.Discount
# 1: 12/16/2019      BP1          2.764138
# 2: 12/16/2019      BP2          6.040000
# 3: 12/16/2019      BP3          0.000012
# 4: 12/17/2019      BP1          4.540000
# 5: 12/17/2019      BP2          3.040000

数据:

dt <- fread("
Date        Item    Discount    Value   Location
12/16/2019  AAA     4%          10000   BP1
12/17/2019  AAA     5%          11000   BP1
12/16/2019  AAA     6%          11500   BP2
12/16/2019  AAC     3%          10000   BP1
12/17/2019  AAC     4%          11000   BP1
12/16/2019  AAC     12%         13000   BP3
12/16/2019  BBC     12%         13500   BP3
12/17/2019  BBC     3%          11000   BP2
12/16/2019  BBC     1%          9000    BP1")