【问题标题】:R merged dataset count time between first purchase and first visitR合并数据集计数首次购买和首次访问之间的时间
【发布时间】:2014-10-23 22:22:32
【问题描述】:

我有 2 个合并在一起的大型数据集。一个数据集包含客户购买的信息,另一个数据集包含同一客户在商店中的访问信息。

当我合并数据时,我是通过 customer_id 进行的,所以现在我有一个如下所示的合并数据集:

#  customer_no       visit date    purchase date
#2       10          20-10-2014         NA 
#3       10              NA         12-01-2013
#4       10          17-06-2011         NA 
#5       10              NA         18-02-2012
#8       30          22-12-2013         NA 
#9       30          14-07-2012         NA 

我想生成一个新变量,它给出了第一次访问和第一次购买之间的差异天数。因此,R 应该能够识别每个唯一 customer_no 的访问列中的第一个日期,识别相同 customer_no 的购买列中的第一个日期,然后计算差异。

据推测,新列将全部为 NA,每个客户一个值。

谢谢!!

因此,对于 10 号客户,她在 2011 年 6 月 17 日首次访问,但在 2012 年 2 月 18 日 -> 246 天进行了首次购买。我想知道合并数据集中所有客户的平均值。

谢谢!

【问题讨论】:

  • 我认为您的列名可能有误
  • 真的!已修复,谢谢!

标签: r distinct difference


【解决方案1】:

这样的事情应该可以解决问题:

library(dplyr)
df %>% group_by(customer_no) %>% 
  summarize(diff = min(as.numeric(as.Date(purchase_date, format = "%d-%m-%Y")), na.rm=T) - 
                   min(as.numeric(as.Date(visit_date, format = "%d-%m-%Y")), na.rm=T))

【讨论】:

  • 嗯,它不工作,或者我做错了。这是我得到的消息: n min(as.numeric(as.Date(structure(c(1191L, NA, NA, NA, ... : no non-missing arguments to min; return Inf 另一种方法是创建一个新列(新变量),它为每个客户提供了首次访问和首次购买之间的差异。对于每个客户,我有多行(所有访问和所有购买),在那个新列中,我将有一个单元格与第一次访问和第一次购买之间的天数,所有其他人都会有 NA。
【解决方案2】:

这个解决方案并不是非常优雅,但据我了解您的要求,它会输出您希望看到的数据框。示例中的for 循环生成警告,因为客户30 没有purchase_date,然后我们试图获取日期和NA 之间的差异,但这没关系,因为结果是另一个NA .

df <- data.frame(customer_no = c(10, 10, 10, 10, 30, 30),
                 visit_date = c("20-10-2014", NA, "17-06-2011", NA, "22-12-2013", "14-07-2012"),
                 purchase_date = c(NA, "12-01-2013", NA, "18-02-2012", NA, NA))

df$diff <- rep(NA, nrow(df)) 


customers <- unique(df$customer_no)
diff_first_visit_purchase <- data.frame()

for (customer in customers) {
  sub.df <- subset(df, customer_no == customer)
  first_visit <- min(as.Date(sub.df$visit_date, format="%d-%m-%Y"), na.rm=TRUE)
  first_purchase <- min(as.Date(sub.df$purchase_date, format="%d-%m-%Y"), na.rm=TRUE)
  temp.df <- data.frame(customer_no = customer,
                        visit_date = NA,
                        purchase_date = NA,
                        diff = as.integer(first_purchase - first_visit))
  diff_first_visit_purchase <- rbind(diff_first_visit_purchase, temp.df)

}


final.df <- rbind(df, diff_first_visit_purchase)
final.df <- final.df[order(final.df$customer_no),]

final.df
#  customer_no visit_date purchase_date diff
#1          10 20-10-2014          <NA>   NA
#2          10       <NA>    12-01-2013   NA
#3          10 17-06-2011          <NA>   NA
#4          10       <NA>    18-02-2012   NA
#7          10       <NA>          <NA>  246
#5          30 22-12-2013          <NA>   NA
#6          30 14-07-2012          <NA>   NA
#8          30       <NA>          <NA>   NA

mean(final.df$diff, na.rm=TRUE)
#[1] 246

【讨论】:

    猜你喜欢
    • 2015-05-13
    • 1970-01-01
    • 1970-01-01
    • 2021-01-07
    • 2012-04-02
    • 2022-09-28
    • 2022-12-13
    • 1970-01-01
    相关资源
    最近更新 更多