基于R中的字段对数据进行分组

时间:2013-04-04 21:20:03

标签: r

我正在使用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

感谢您的帮助!

2 个答案:

答案 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