我正在处理一个数据文件,其中包含来自各个连锁店的产品销售情况,例如超级市场。 (来自this dataset,以防万一。 该文件包含许多字段:
我想计算每种产品的交易数据集的平均价格。 对于本练习,我假设我可以通过以下字段定义唯一产品:类别,品牌,产品尺寸,以便任何唯一产品都对应于这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))
答案 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)