遍历交易文件以得出产品的平均价格

时间:2019-05-08 19:12:14

标签: r loops vectorization

我正在处理一个数据文件,其中包含来自各个连锁店的产品销售情况,例如超级市场。 (来自this dataset,以防万一。 该文件包含许多字段:

  1. id-唯一的客户ID
  2. 链-商店链ID
  3. dept-类别(例如水)的汇总分组
  4. 类别-产品类别(例如苏打水)
  5. company-销售商品的公司的ID
  6. brand-商品所属品牌的ID
  7. 日期-购买日期
  8. 产品尺寸-购买的产品量(例如16盎司水)
  9. productmeasure-产品购买单位(例如盎司)
  10. 购买量-购买的单位数
  11. purchaseamount-购买金额(美元)
  12. productprice-产品价格(根据购买金额/购买量得出)

我想计算每种产品的交易数据集的平均价格。 对于本练习,我假设我可以通过以下字段定义唯一产品:类别,品牌,产品尺寸,以便任何唯一产品都对应于这3个字段的唯一组合。

因此,首先我确定数据集中的唯一项以获取所有产品的列表:

#transactions is the name of the data frame
items <- unique(transactions %>% select(category, brand, productsize))

我现在可以将其用作查找表,以从交易数据集中提取独特的产品,并得出每个产品的平均价格。

由于我是新手,所以我只能设法使其(不太优雅)用于 for循环

for (i in 1:nrow(items)) {
  temp1 <- filter(transactions, category==items[i,1])
  temp2 <- filter(temp1, brand==items[i,2])
  temp3 <- filter(temp2, productsize==items[i,3])
  items$meanvalue[i]<- mean(temp3$productprice)
}

这有效,但是当然很慢。 transaction 数据框有480612个条目,而 items 数据框有56658个。我没有大型数据集的经验,但是我确定问题出在代码上,没有那么大。

pastebin中的示例文件(300行)。

编辑:发现summarise很好用!

avgPrice <- transactions %>% group_by(category, brand, productsize) %>% summarise(avgPrice = mean(productprice))

1 个答案:

答案 0 :(得分:1)

由于R是向量化的,因此它应该比使用for循环快得多!

# library(tidyverse) # if needed

# get item combinations
itemCombs <- transactions %>% 
  group_by(category, brand, productsize) %>% 
  slice(1) %>% 
  ungroup() %>% 
  mutate(item = 1:n()) %>% 
  select(item, everything())

# append item combinations to original dataset and calculate avg price per item 
avgPrice <- transactions %>% 
  left_join(itemCombs, by = c("category", "brand", "productsize")) %>% 
  select(item, productprice) %>% 
  arrange(item) %>% 
  group_by(item) %>% 
  mutate(nItems = n(),
         sumPrice = sum(productprice)) %>% 
  ungroup() %>% 
  mutate(avgPrice = sumPrice/nItems)