【问题标题】:Aggregating Categorical Variable Values in a single variable in R在 R 中的单个变量中聚合分类变量值
【发布时间】:2014-04-23 02:07:50
【问题描述】:

我有一个包含以下变量的数据集 - Bill_Number、Item_Name、Quantity。一个 Bill_Number 下可以有多个 Item_Name。我试图通过 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”是一个单独的行,而我需要一个给定编号的所有产品和该账单编号的总数量的组合。

我需要的输出格式如下:

  • 比尔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 作为数字变量进一步求和)会发生什么?

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

    谢谢, 拉乌尔

    【问题讨论】:

    • 您忘记粘贴Dummy1 数据框了吗?
    • 抱歉,我忘了。

    标签: r plyr summarization


    【解决方案1】:

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

    第一步:创建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)]
    

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

    【讨论】:

    • 这对我来说非常有效!在我超过十万条记录的整个数据集上!绝对精彩!非常感谢!
    • 很高兴听到这个消息!我发现你还没有接受答案……你还在寻找什么吗??
    【解决方案2】:

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

    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
    

    【讨论】:

    • 非常感谢,这非常有效。让我将其扩展到主数据集。如果我撞墙了,会通知你的。感谢您的帮助!
    • 嗨,这很有效,但在大约 200 个观察的有限数据集上。除此之外,大约 103,000 条记录的数据集花了将近 3 个小时,最终挂了我的电脑。我增加了对 R 的内存分配并在大约 3000 条记录的有限数据集上运行它,但同样的事情发生了。请问有没有一种解决方法可以使它对大型数据集有效?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-22
    • 1970-01-01
    • 2015-07-04
    • 2019-01-23
    • 1970-01-01
    • 1970-01-01
    • 2023-01-04
    相关资源
    最近更新 更多