我正在处理一个数据文件,该数据文件包含来自各种商店链的销售,例如。超级市场。(以防有人熟悉,从该数据集中取出(。该文件包含许多字段:
- ID-唯一的客户ID
- 链 - 商店链ID
- Dept-类别的总体分组(例如水(
- 类别 - 产品类别(例如苏打水(
- 公司 - 出售该商品的公司ID
- 品牌 - 物品所属品牌的ID
- 日期 - 购买日期
- 产品化 - 产品购买的金额(例如16盎司水(
- 产品量 - 产品购买的单位(例如盎司(
- 购买 - 购买的单位数量
- puchaseamount-购买的美元金额
- ProductPrice-产品价格(由puchaseamount/publuequantity得出(
我想为每种产品计算整个交易数据集的平均价格。对于此练习,我假设我可以通过以下字段来定义唯一产品:类别,品牌,产品尺寸,以便任何唯一的产品都对应于这3个字段的独特组合。
因此,首先,我确定数据集中的唯一项目以获取所有产品的列表:
#transactions is the name of the data frame
items <- unique(transactions %>% select(category, brand, productsize))
我现在可以将其用作查找表,以从交易数据集中拾取唯一产品并得出每个产品的平均价格。
由于我是新手,所以我只是设法让它与loop 的(不太优雅(::
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)
}
这有效,但是当然非常慢。交易数据框架具有480612条目, items 数据框架的数据框架为56658。我没有大数据集的经验,但我敢肯定问题是代码,代码,大小不大。
pastebin中的示例文件(300行(。
编辑:发现summarise
可以很好地工作!
avgPrice <- transactions %>% group_by(category, brand, productsize) %>% summarise(avgPrice = mean(productprice))
由于r被矢量化,这应该比使用for loop快得多!
# 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)