我正在编制一个数据文件,其中包含来自不同连锁商店(如超市)的产品销售情况。(取自此数据集,以防有人熟悉)。该文件包含若干字段:
我想要计算每个产品的平均价格。在这个练习中,我假设我可以通过以下字段来定义一个唯一的产品:类别、品牌、产品大小,这样任何唯一的产品都对应于这三个字段的唯一组合。
因此,首先,我标识了数据集中的唯一项,以获得所有产品的列表:
#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)
}这是可行的,但它当然很慢。所述事务数据帧具有480612个条目,所述项数据帧具有56658。我没有处理大型数据集的经验,但我确信问题在于代码,而不是代码的大小。
巴斯丁中的示例文件(300行)。
编辑:发现summarise在这方面运行得很好!
avgPrice <- transactions %>% group_by(category, brand, productsize) %>% summarise(avgPrice = mean(productprice))发布于 2019-05-08 22:59:31
因为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)https://stackoverflow.com/questions/56047544
复制相似问题