【问题标题】:Using R data.table to aggregate select rows使用 R data.table 聚合选择行
【发布时间】:2013-07-08 07:02:31
【问题描述】:

这是我的单个客户的客户订单数据:

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,那就更好了。

【问题讨论】:

  • 您尝试customer_stats[, avg_order_size := mean(order_total), by=list(order_no, customer_id)] 使用:= 是否已经执行分配,因此无需额外分配您的data.table
  • @dickoa,如果您同时按order_nocustomer_id 分组,那么您将采用100, 300, 100, 200 的平均值单独(这将结束相同的值)。
  • @Arun 是的,你是对的
  • @Bryan,我认为您的问题已得到解答。很高兴能回答这个问题。

标签: r aggregate data.table


【解决方案1】:

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

dat[, sum(amount), by = list(customer_id, order_no)][ ,avg_order := mean(V1), by = customer_id]

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 我很抱歉,但你为什么在这里总结amount?他总结了100 + 300 + 100 + 200(在order_total,而不是amount)?
    • 取景效果!他通过order_no 创建了order_totalamount。请参阅对他的问题的编辑,他询问是否可以在不计算 order_total 的情况下完成此操作。
    【解决方案3】:

    我认为诀窍是按客户和订单键入原始表,将客户和订单的订单总数相加,得到客户的平均订单总数,然后将其连接回原始表。

    # 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
    

    【讨论】:

      猜你喜欢
      • 2019-08-13
      • 2017-03-10
      • 2015-04-29
      • 1970-01-01
      • 2013-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多