【问题标题】:R finding the average order interval (number of days)R查找平均订单间隔(天数)
【发布时间】:2015-06-25 19:08:49
【问题描述】:

我的目标是获取购买给定产品所需的平均天数。如果 Product_A 在给定时间段内购买了 3 次(“2012-12-01”、“2012-12-05”、“2012-12-10”),那么我们的平均订单间隔将是 4 和 5 - 4.5 天的平均值.

我编写了一个 For 循环来计算两点之间的间隔(我可以使用聚合函数来计算我的平均值或乘积的中位数),但我一直收到长度错误。这应该是一个可扩展的解决方案

这是一个示例数据框:

product_info <- data.frame(productId = c("A", "A", "A", "B","B","B"), 
                           order_date = c("2014-05-01", "2014-05-05", "2014-05-10", "2014-06-01","2014-06-07", "2014-06-18"), stringsAsFactors=FALSE)

这是我的代码:

 for (i in 2:length(unique(product_info$productId))){
  if(product_info$productId[i]==product_info$productId[i-1]){
    product_info$interval[i] <- as.integer(difftime(product_info$order_date[i],product_info$order_date[i-1]))
  }
}

我想要的输出应该是:

product_info <- data.frame(productId = c("A", "A", "A", "B","B","B"), 
                           order_date = c("2014-05-01", "2014-05-05", "2014-05-10", "2014-06-01","2014-06-07", "2014-06-18"), 
                           interval= c("0", "4", "5", "0","6","11"), stringsAsFactors=FALSE)

非常感谢任何帮助。

谢谢

【问题讨论】:

    标签: r for-loop


    【解决方案1】:

    你可以试试

      product_info$order_date <- as.Date(product_info$order_date)
    
      product_info$interval <- with(product_info, ave(as.numeric(order_date), 
                      productId, FUN=function(x) c(0, diff(x))))
      product_info
      productId order_date interval
    1         A 2014-05-01        0
    2         A 2014-05-05        4
    3         A 2014-05-10        5
    4         B 2014-06-01        0
    5         B 2014-06-07        6
    6         B 2014-06-18       11
    

    或使用data.table

     library(data.table)#v1.9.5+
     setDT(product_info)[,interval := c(0, diff(as.Date(order_date))) , productId]
    

    如果'order_date'没有排序,我们必须在'diff'之前'order'它

     setDT(product_info)[, order_date:= as.Date(order_date)
               ][order(order_date), interval :=as.numeric(order_date -
               shift(order_date, fill=order_date[1L])) , by = productId]
     #    productId order_date interval
     #1:         A 2014-05-01        0
     #2:         A 2014-05-05        4
     #3:         A 2014-05-10        5
     #4:         B 2014-06-01        0
     #5:         B 2014-06-07        6
     #6:         B 2014-06-18       11
    

    【讨论】:

    • 这行得通。仅对于将来希望使用此功能的读者,您必须首先按 productId 和 order_date 对数据框进行排序,无论您使用哪种解决方案。谢谢阿克伦。
    【解决方案2】:

    转换为日期格式 -

    product_info$order_date <- as.Date(product_info$order_date)
    

    使用dplyr

    library(dplyr)
    product_info %>% group_by(productId) %>%
                     mutate(interval=c(0,diff(order_date))
    

    【讨论】:

    • 感谢杰里米的帮助。这个解决方案也很有效。
    【解决方案3】:

    这是一个dplyr 解决方案。您首先要转换为日期格式,然后按日期排序,按产品分组,最后添加该产品最近两天之间的差异列。请注意,0 天已替换为 NA,恕我直言,它比 0 更适用。

    library(dplyr)
    product_info <- product_info %>%
        mutate(order_date=as.Date(order_date)) %>%
        arrange(order_date) %>%
        group_by(productId) %>%
        mutate(interval=order_date-lag(order_date))
    
    product_info
      productId order_date interval
    1         A 2014-05-01  NA days
    2         A 2014-05-05   4 days
    3         A 2014-05-10   5 days
    4         B 2014-06-01  NA days
    5         B 2014-06-07   6 days
    6         B 2014-06-18  11 days
    

    【讨论】:

      猜你喜欢
      • 2022-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多