1

我有一个包含以下变量的数据集 - Bill_Number、Item_Name、Quantity。一个 Bill_Number 下可以有多个 Item_Name。我试图通过 Bill_Number 和 Quantity 来总结它,其中 Item_Names 被连接到每个账单编号的单个变量中。这里的解决方案:组合几个行变量适用于有限和预定义的框架(如下所示),但我有数百个 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”是一个单独的行,而我需要一个给定数量的所有产品和该账单号码的总数量的组合。

我需要的输出格式如下:

  • 比尔N | 物品名称 | 数量
  • B1 | 产品 A + 产品 B + 产品 C + 产品 D | 4
  • B2 | 产品 A + 产品 B + 产品 C + 产品 D | 4
  • B3 | 产品 A + 产品 B + 产品 C + 产品 D | 4
  • 而我从上面的代码中得到的输出是:

  • 比尔N | 物品名称 | 数量
  • B1 | 产品 A + 产品 B + 产品 C | 4
  • B1 | 产品 D | 2
  • B2 | 产品 A + 产品 B + 产品 C | 4
  • B2 | 产品 D | 2
  • B3 | 产品 A + 产品 B + 产品 C | 4
  • B3 | 产品 D | 2
  • 扩展场景,如果我有更多变量,例如每个 Item_Name 的 Brand、Category、Sub_category 和 Sales_Amount 作为数字变量来进一步求和,会发生什么?

    如果您需要更多信息或有疑问,请告诉我。

    谢谢,拉乌尔

    4

    2 回答 2

    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)
    )
    

    Step2:设置合适的key:

    setkey(DT,BillN)
    

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

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

    Step4:执行操作key

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

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

    于 2014-04-23T02:39:08.050 回答
    0

    这是一个示例,将Quantity变量 byBillNBillNs 的计数与您的预期输出相加:

    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
    
    于 2014-04-23T02:38:11.170 回答