在R中的单个变量中聚合分类变量值

时间:2014-04-23 02:07:51

标签: r plyr summarization

我有一个包含以下变量的数据集--Bill_Number,Item_Name,Quantity。单个Bill_Number下可以有多个Item_Names。我试图通过Bill_Number和Quantity来总结它,其中Item_Names被连接成每个账单号的单个变量。这里的解决方案:Combine several row variables适用于有限和预定义的框架(如下所示),但我有数百个Item_Names。我相信有一种更简单的方法可以做到这一点。有人可以帮忙吗?

数据(仅限样本):

BillN<-c('B1','B1','B1','B1','B2','B2','B2','B2','B3','B3','B3','B3')

Item_Name<-c('Prod A','Prod B','Prod C','Prod D','Prod A','Prod B','Prod C','Prod D','Prod A','Prod B','Prod C','Prod D') # going on to Product(n)

Quantity<-c(1,2,1,2,1,2,1,1,1,2,1,1)

输出:使用ply::ddply

ddply(within(Dummy1, {
  Item_Name <- ifelse(Item_Name %in% c('Prod A','Prod B','Prod C'), 'Prod A + Prod B + Prod C', 'Prod D')
}), .(BillN, Item_Name), summarise, Count=sum(Quantity))

这取决于'Prod D'是一个单独的行,而我需要给定数字的所有产品和该帐单号的总数量的组合。

我需要的输出采用以下格式:

  • BillN | Item_Name |量
  • B1 | Prod A + Prod B + Prod C + Prod D | 4
  • B2 | Prod A + Prod B + Prod C + Prod D | 4
  • B3 | Prod A + Prod B + Prod C + Prod D | 4
  • 而我从上面的代码得到的输出是:

  • BillN | Item_Name |量
  • B1 | Prod A + Prod B + Prod C | 4
  • B1 |产品D | 2
  • B2 | Prod A + Prod B + Prod C | 4
  • B2 |产品D | 2
  • B3 | Prod A + Prod B + Prod C | 4
  • B3 |产品D | 2
  • 扩展方案,如果我有更多变量,例如每个Item_Name的Brand,Category,Sub_category和Sales_Amount作为数字变量,进一步求和,会发生什么?

    如果您需要更多信息或有疑问,请与我们联系。

    谢谢, 拉乌尔

    2 个答案:

    答案 0 :(得分:1)

    以下是使用data.table包的快速解决方案:

    第1步:创建data.table

    library(data.table)
    
    DT <- data.table(
      BillN=c('B1','B1','B1','B1','B2','B2','B2','B2','B3','B3','B3','B3'),
      Item_Name=c('Prod A','Prod B','Prod C','Prod D','Prod A','Prod B','Prod C','Prod D','Prod A','Prod B','Prod C','Prod D'), # going on to Product(n)
      Quantity=c(1,2,1,2,1,2,1,1,1,2,1,1)
    )
    

    步骤2:设置适当的密钥:

    setkey(DT,BillN)
    

    步骤3:确保字符串向量Item_Name不是factor

    DT[,Item_Name := as.character(Item_Name)]
    

    步骤4:按key

    执行操作
    DT[,list(Item_Name =paste(Item_Name,collapse=" + "),
             Quantity=sum(Quantity)),
       by=key(DT)]
    

    您可以按原样使用结果,也可以折叠每一行!这很简单!!

    答案 1 :(得分:0)

    以下是根据QuantityBillN变量和BillN s的计数相加作为预期输出所需的示例:

    Dummy1 <- data.frame(BillN, Item_Name, Quantity)
    
    ldply(by(Dummy1, Dummy1$BillN, simplify=TRUE, FUN=function(x) {
    
      BillN <- x[1,]$BillN
      Quantity <- sum(x$Quantity)
      Item_Name <- paste(as.character(unique(x$Item_Name)), sep="", collapse=" + ")
      BillCt <- nrow(x)
    
      return(data.frame(BillN, Item_Name, Quantity, BillCt))
    
    }))[2:5]
    
    ##  BillN                         Item_Name Quantity BillCt
    ## 1    B1 Prod A + Prod B + Prod C + Prod D        6      4
    ## 2    B2 Prod A + Prod B + Prod C + Prod D        5      4
    ## 3    B3 Prod A + Prod B + Prod C + Prod D        5      4