我正在使用R来完成以下任务。我有一个看起来像这样的数据集:
Item Category Price
aaa 1 10.00
bbb 2 5.00
ccc 3 20.00
ddd 1 25.00
eee 3 5.00
fff 2 15.00
是否可以按类别对项目进行分组并计算一些汇总统计信息(例如,平均价格或总价格总和)?
基本上,我正在尝试创建这样的东西:
Cateogry AveragePrice
1 17.50
2 10.00
3 12.50
感谢您的帮助!
答案 0 :(得分:3)
假设是data.table
(这将为您提供最佳性能和语法):
library(data.table)
DT <- data.table(myDF) # where myDF is the original data.frame
DT[, list(AveragePrice = mean(Price),
SumOfPrices = sum(Price)),
by = Category]
答案 1 :(得分:1)
充实@Roman Lustrik的建议,因此为简单而留在R
基地:
df1 <- data.frame(
Category=c(1,2,3,1,3,2),
Price= c(10,5,20,25,5,15)
)
aggregate(df1,by=list(df1[,"Category"]),FUN=mean)
给出:
Group.1 Category Price
1 1 1 17.5
2 2 2 10.0
3 3 3 12.5
或
tapply(df1[,"Price"], df1[,"Category"], mean)
给出:
1 2 3
17.5 10.0 12.5
(注意df1[,"Price"]==df1$Price
所以可以使用任何一种风格)。
就个人而言,我更喜欢aggregate()
的输出,而且速度要快一些,尽管在小型数据集上这是相当学术性的:
require(microbenchmark)
microbenchmark( aggregate(df1,by=list(df1[,"Category"]),FUN=mean) )
microbenchmark( tapply(df1[,"Price"], df1[,"Category"], mean) )
给出(为简洁起见而简化):
min lq median uq max
2.233209 2.268719 2.311002 2.362932 4.018134
771.361 792.0915 807.2805 829.2435 1201.581
最后,如果您希望输出与问题中的示例完全相同:
a1 <- aggregate(df1,by=list(df1[,"Category"]),FUN=mean )
a1 <- a1[,-1] # remove 1st column
a1[,2] <- format(a1[,2],nsmall=2) # give 2 decimal places
colnames(a1)[2] <- "AveragePrice" # assign name to 2nd column
给出:
Category AveragePrice
1 1 17.50
2 2 10.00
3 3 12.50