我有一个包含多个产品的数据集(示例中为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/2019
(W.BP1
中的加权平均折扣)为:BP1
(2.72%
。
结果如下:
Value of each item in PB1 divided by sum of the values, multiplied by the respective discount, then summed up
我可以在excel中完成几行和几个位置,但是需要找到一种R的方式。 预先谢谢你
答案 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
Date
和Discount
都处于“分类”模式。如果打算分析性地使用它们(按日期排序,计算差异,乘以数值等),则需要将它们转换为“适当的” 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")