我有一个包含以下变量的数据集--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'是一个单独的行,而我需要给定数字的所有产品和该帐单号的总数量的组合。
我需要的输出采用以下格式:
而我从上面的代码得到的输出是:
扩展方案,如果我有更多变量,例如每个Item_Name的Brand,Category,Sub_category和Sales_Amount作为数字变量,进一步求和,会发生什么?
如果您需要更多信息或有疑问,请与我们联系。
谢谢, 拉乌尔
答案 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)
以下是根据Quantity
将BillN
变量和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