我有以下两个数据库表:
**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也在他们的努力中。非常感谢提前。
答案 0 :(得分:1)
90天的条件可以实现为
dayLookup = 90
和filter(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