使用dplyr / R基于90天合并数据库表

时间:2016-07-08 12:52:49

标签: r dplyr

我有以下两个数据库表:

 **PLAN table**:
 customerID    plantype    purchasedate
      1          A          7/16/2004
      1          A           9/1/2005
      2          B          12/3/2014

**EMAIL table**
customerID  emaildate  openIND opendate
1           2/3/2005      1    2/4/2005
1         10/23/2005      0     NULL
2           1/2/2014      1    1/2/2014
2          1/10/2014      1   1/11/2014

我要做的是在R中使用dplyr创建一个数据框,该数据框将计算在购买日期前90天或更短时间内为所有客户打开的电子邮件的百分比(计划表中的C列)。

我可以在Excel中使用大量的if语句,vlookup和操作来完成此操作。我已经阅读了很多在这个非常有用的网站上使用summarize()和group_by()的例子,但是我在R中实际实现这个例子很困难,因为这些例子对于我目前的R技能来说有点过于先进。

我可以使用dplyr计算使用这些聚合函数打开的电子邮件的生命周期百分比,但是我很难指定如何指定90天的范围,而且由于'purchaseate'对于大行中的每一行都不同而更加复杂数据集。我目前成功的生命周期计算代码如下:

df2 <-
select(PLAN,customerID,year) %>%
filter(customerID %in% southeast_vector) %>%
arrange(customerID, year) %>%
left_join(EMAIL)%>%
select(customerID, emaildate, year) %>%
group_by(customerID, year) %>%
summarise(lifetimeNumEmails = n(),
      lifetimeNumEmailsOpened = sum(openIND))%>%
mutate(lifetimeEmailOpenPercentage = lifetimeNumEmailsOpened/lifetimeNumEmails)

我非常感谢您可以为如何指定这个90天范围提供任何指导,以便我可以在R中动态计算此计算。希望除了解决我的问题之外,这可以帮助那些从excel进行初始转换的人R和dplyr也在他们的努力中。非常感谢提前。

1 个答案:

答案 0 :(得分:1)

90天的条件可以实现为

dayLookup = 90filter(openIND ==1 & (purchasedate - opendate) >= dayLookup )

require(dplyr)

planDF = read.table(text="customerID    plantype    purchasedate
      1          A          7/16/2004
      1          A           9/1/2005
      2          B          12/3/2014",stringsAsFactors=FALSE,header=TRUE)



planDF$purchasedate = as.Date(planDF$purchasedate  ,format="%m/%d/%Y")
planDF$year = year(planDF$purchasedate)

emailDF = read.table(text="customerID  emaildate  openIND opendate
1           2/3/2005      1    2/4/2005
1         10/23/2005      0     NULL
2           1/2/2014      1    1/2/2014
2          1/10/2014      1   1/11/2014",stringsAsFactors=FALSE,header=TRUE)

emailDF$emaildate = as.Date(emailDF$emaildate  ,format="%m/%d/%Y")
emailDF$opendate = as.Date(emailDF$opendate  ,format="%m/%d/%Y")




#southest_vector was not provided

    outputDF <-
select(planDF,purchasedate,customerID,year) %>%
#filter(customerID %in% southeast_vector) %>%
arrange(customerID, year) %>%
    left_join(emailDF)%>%
        select(customerID,purchasedate,openIND,opendate, emaildate, year) %>%
        group_by(customerID, year) %>%
        filter(openIND ==1 & purchasedate - opendate >= dayLookup ) %>%
        summarise(lifetimeNumEmails_90d = n(),lifetimeNumEmailsOpened_90d = sum(openIND),
        lifetimeEmailOpenPercentage_90d = lifetimeNumEmailsOpened_90d/lifetimeNumEmails_90d) %>% 
        as.data.frame()

请确认输出是否符合您的要求

#Output:

#    customerID year lifetimeNumEmails_90d lifetimeNumEmailsOpened_90d lifetimeEmailOpenPercentage_90d
# 1          1 2005                     1                           1                               1
# 2          2 2014                     2                           2                               1