【发布时间】:2018-09-13 21:02:59
【问题描述】:
我有一个数据框,我们称之为 df1,看起来像这样:
month product_key price
201408 00020e32-a64715 75
201408 00020e32-a64715 75
201408 000340b8-bacac8 20
201408 000458f1-fdb6ae 45
201408 00083ebb-e9c17f 250
201408 00207e67-15a59f 480
201408 002777d7-50bec1 12
201408 002777d7-50bec1 12
201409 00020e32-a64715 75
201409 000340b8-bacac8 20
201409 00083ebb-e9c17f 250
201409 00207e67-15a59f 480
201409 00207e67-15a59f 480
201409 00207e67-15a59f 480
201410 00083ebb-e9c17f 250
201410 00207e67-15a59f 480
201410 00207e67-15a59f 480
201410 0020baff-9730f0 39.99
201411 00083ebb-e9c17f 250
201411 00207e67-15a59f 480
201412 00083ebb-e9c17f 250
201501 00083ebb-e9c17f 200
201501 0020baff-9730f0 29.99
数据集中还有其他变量,但我们不需要它们。我的数据集是月度数据,范围从 2014 年年中到 2015 年末。每个月有数百种产品,一个月内可能有多次相同的产品。
我想要做的是识别在 8 月和 9 月都出现的产品,并删除两个月都没有出现的产品。然后我想计算每个月剩余产品的平均价格。然后我想用 9 月的平均价格除以 8 月的平均价格。在我的数据框中,这个计算出来的数字是 9 月的指数(8 月默认为 1,因为这是数据集开始的地方)。
然后我想在接下来的所有月份都这样做,所以我想识别在 9 月和 10 月都出现的产品,删除两个月都没有出现的产品,并计算平均价格(其余产品)每个月。然后我想将 10 月的平均价格除以 9 月的平均价格(这将与之前计算的 9 月平均价格不同,因为与 8 月都出现的产品相比,9 月和 10 月出现的产品很可能不同和九月)。这个计算出来的数字就是 10 月份的指数。 所以我想在接下来的所有月份(10 月和 11 月、11 月和 12 月、12 月和 1 月、1 月和 2 月……等等)都这样做
我生成的数据框理想情况下看起来像这样(使用任意数字作为索引):
month index
201408 1
201409 1.0005
201410 1.0152
201411 0.9997
201412 0.9551
201501 0.8985
201502 0.9754
201503 1.0045
201504 1.1520
201505 1.0148
201506 1.0452
201507 0.9945
201508 0.9751
201509 1.0004
201510 1.0415
当我尝试这样做时,我最终会在整个数据集上匹配产品,而不是连续 2 个月以上。我可以通过将数据集分解为每个月的大量数据集来做到这一点,但这似乎冗长乏味。我确定有更快的方法来做到这一点?
您可以使用下面的代码来创建测试数据集:
month <- c("201408", "201408", "201408", "201408", "201408", "201408", "201408", "201408", "201409", "201409", "201409", "201409", "201409", "201409", "201410", "201410", "201410", "201410", "201411", "201411", "201412", "201501", "201501")
product_key <- c("00020e32-a64715", "00020e32-a64715", "000340b8-bacac8", "000458f1-fdb6ae", "00083ebb-e9c17f", "00083ebb-e9c17f", "002777d7-50bec1", "002777d7-50bec1", "00020e32-a64715", "000340b8-bacac8", "00083ebb-e9c17f", "00207e67-15a59f", "00207e67-15a59f", "00207e67-15a59f", "00083ebb-e9c17f", "00207e67-15a59f", "00207e67-15a59f", "0020baff-9730f0", "00083ebb-e9c17f", "00207e67-15a59f", "00083ebb-e9c17f", "00083ebb-e9c17f", "0020baff-9730f0")
price <- c("75", "75", "20", "45", "250", "480", "12", "12", "75", "20", "250", "480", "480", "480", "250", "480", "480", "39.99", "250", "480", "250", "200", "29.99")
df1 <- data.frame(month, product_key, price)
举个例子说明我希望它如何工作 - 这是我为 8 月和 9 月创建索引所做的工作。
DF1Aug <- DF1 %>%
filter(month %in% "201408") %>%
group_by(product_key) %>%
summarize(aveprice=mean(price))
DF1Sept <- DF1 %>%
filter(month %in% "201409") %>%
group_by(product_key) %>%
summarize(aveprice=mean(price))
SeptPriceIndex <- transform(merge(DF1Aug, DF1Sept, by=c("product_key"), suffixes=c("_Aug", "_Sept"))) %>%
mutate(AugAvgPrice=mean(aveprice_Aug)) %>%
mutate(SeptAvgPrice=mean(aveprice_Sept)) %>%
mutate(priceIndex = SeptAvgPrice/AugAvgPrice)
但是,这显然是一个乏味的过程,在我在数据框中的大约 20 个月内执行此操作(并且我需要在多个数据框上执行此操作)所以我想找到一种方法来自动化它。
【问题讨论】:
标签: r date dataframe dplyr data-manipulation