1

这是我的客户订单数据对于单个客户的样子:

order_no customer_id  product amount  order_total
      23           1        A    100          100 
      24           1        A    100          300
      24           1        B    100          300
      24           1        C    100          300
      25           1        B    100          100
      26           1        A    100          200
      26           1        B    100          200

我想计算新列中每个客户的平均订单大小,所以对于这个客户,它将是 175 = (100 + 300 + 100 + 200) / 4:

order_no customer_id  amount  order_total  avg_order_size
      23           1     100          100             175
      24           1     100          300             175
      24           1     100          300             175
      24           1     100          300             175
      25           1     100          100             175
      26           1     100          200             175
      26           1     100          200             175

我试过使用这个的某个版本,但没有运气:

customer_stats <- data.table(customer_stats)[, avg_order_size := mean(order_total), by=list(order_no, customer_id)]

我真正需要做的是从每个 order_no 中只选择一行,可能类似于mean所有order_no[1]使用by=(customer_id)?如果有一种方法可以一步完成并跳过创建order_total,那就更好了。

4

3 回答 3

2

这个呢,它似乎翻译了你的方法,不需要在order_total这里计算。

dat[, sum(amount), by = list(customer_id, order_no)][ ,avg_order := mean(V1), by = customer_id]
于 2013-07-08T07:54:08.113 回答
0

我认为诀窍是按客户和订单键入原始表,按客户和订单汇总订单总额,按客户获得平均订单总额,然后将其连接回原始表。

# Your data (next time, consider putting R-formatted data in the question...):
dt <- data.table(customer_id=1,
                 order_no=c(23,24,24,24,25,26,26),
                 product=c("A","A","B","C","B","A","B"),
                 product_amount=100,
                 key=c("customer_id","order_no")) # 1: key by customer and order

dt
#   customer_id order_no product product_amount
#1:           1       23       A            100
#2:           1       24       A            100
#3:           1       24       B            100
#4:           1       24       C            100
#5:           1       25       B            100
#6:           1       26       A            100
#7:           1       26       B            100

dt[ # 4: join summary back to original
  dt[,list(order_total=sum(product_amount)),by=list(customer_id,order_no)] [ # 2: order total by customer and order
    ,avg_order_size:=mean(order_total),by=list(customer_id)] # 3: add the average of order total by customer
  ]
#   customer_id order_no product product_amount order_total avg_order_size
#1:           1       23       A            100         100            175
#2:           1       24       A            100         300            175
#3:           1       24       B            100         300            175
#4:           1       24       C            100         300            175
#5:           1       25       B            100         100            175
#6:           1       26       A            100         200            175
#7:           1       26       B            100         200            175
于 2013-09-06T18:34:05.940 回答
0

order_total您可以通过这样做来避免创建:

customer_stats[ , avg_order_size := sum(amount, na.rm=TRUE) / length(unique(order_no)), by=customer_id]

但是,我对这将有多快有所保留。

于 2013-07-08T07:26:51.753 回答