我有两个桌子。一种带有有关在不同网站上出售商品应支付的佣金信息的信息。我想为其创建售价的其他持有商品。
请同时查看两个表:
Channel <- c("DIRECT", "EBAY", "AMAZON")
Commission_percentage <- c(.1, .5, .4)
Min_commission <- c(0, 0, 2)
Processing <- c(0.05, 0.05, 0.03)
Commission_table <- as.data.frame(cbind(Channel, Commission_percentage,
Min_commission, Processing))
上面的佣金表显示了每个网站的佣金百分比,但显示AMAZON将为每次销售收取2英镑的最低费用。它还显示了另一个%的付款处理费用。下表显示了5件将要出售的物品。它显示了网站以及以前为该商品支付的金额(费用)。
Item <- c("A1", "A2", "A3", "A4", "A5")
Cost <- c(10, 14, 18.85, 20, 5)
Channel <- c("DIRECT", "EBAY", "AMAZON", "AMAZON", "AMAZON")
Price_table <- as.data.frame(cbind(Item, Cost, Channel))
我需要为Price_table创建一列,该列显示每个项目的“收支平衡”价格。我需要根据商品的销售渠道找到适用的佣金费用,对于亚马逊商品,如果标准佣金百分比计算得较低,则需要确保收取最低2英镑的佣金。比这个。
需要澄清的是,收支平衡价格必须是 费用+最高金额(佣金百分比*费用,最低佣金) +(处理*(费用+最高(佣金百分比*费用,最低佣金)))
理想情况下,这需要提高内存效率,因为数据库非常大。因此,为什么我不只是考虑合并功能,一旦计算出价格就删除了多余的列。
非常感谢, 丹
答案 0 :(得分:1)
让我们假设这些数据框是通过 right 方式构造的。
Price_table <- data.frame( Item, Cost, Channel)
Commission_table <- data.frame(Channel, Commission_percentage, Min_commission, Processing)
如果内存有限,那么也许可以使用for
循环,该循环将不会继续复制大部分数据帧:
befunc <- function( Cost,
Commission_percentage,
Min_commission, Processing ) {
Cost +
max(Commission_percentage * Cost, Min_commission) +
Processing*(Cost +
max(Commission_percentage * Cost, Min_commission))}
BE <- numeric(length(Price_table[['Channel']])) #pre-allocation
for ( Ch in seq_along(Price_table[['Channel']]) ){
Cost = Price_table[Ch, "Cost"]
Chan <- Price_table[Ch, "Channel"];
CommPct <- Commission_table[ match(Chan,Commision_table[["Channel"]]), "Commission_percentage"]
MinComm <- Commission_table[ match(Chan,Commision_table[["Channel"]]), "Min_commission"]
Proc <- Commission_table[ match(Chan,Commision_table[["Channel"]]), "Processing"]
BE[Ch] <- befunc( Cost, CommPct, MinComm, Proc) }
这应该允许在(或如果)内存有限时进行垃圾收集。