我是R的新手已经在网上完成了几个教程并付费但仍然在努力实现我的要求。我想在R中建立一个保留队列。我目前在excel中这样做,每次我需要实现一个时间需要4-5个小时。因此,探索R是否可以提供帮助。看起来似乎是这样但需要一些方向。
以下是excel中的输出。如果您注意到2011年5月我有31位客户加入,他们的月度进展到当月。
初始列是客户ID,加入日期和到期日期。另外两列会转换dj
& de
发短信。从K
开始的列是处理数据以检查客户在给定月份是否处于活动状态还是已经搅动?我使用文本中的联接日期来表示活动,并将其附加到“C”以表示过期。稍后我只计算带有日期的列以获得同类群组。
那么,我如何在R。
中实现这一点假设这是样本数据,我需要2015年5月1日至2016年1月1日的队列
customer dj exp
abc 01/05/15 25/6/15
efg 01/05/15 25/7/15
ghd 01/05/15 25/7/15
mkd 01/06/15 25/7/15
kskm 01/06/15 05/8/15
这是我想从上面的数据中创建的。
Cohort M0 M1 M2 M3 M4
2015-05 3 3 2 0 0
2015-06 2 2 1 1 0
说明:M0是自加入之日起的月份。因此,5月份有3人加入我们,所有人都在5月份活跃起来。 M1将是六月,所有这些都在六月活跃。我们在6月底在25日失去了1位客户,因此他会认为他在6月份活跃,但在M2中,我的数量从3下降到2. 5月加入的客户的M3对应于我们失去客户的8月份
2015-06队列的类似过程。 M1将是7月份,M3将是9月份。
答案 0 :(得分:1)
修改你的代码,如下所示,谢谢!现在试图找出一种方法使M0到M(n)动态。
library(readxl)
library(zoo)
library(plyr)
# Read in the data
df <- read.csv("~/Desktop/R/data.csv")
df$dj <- as.Date(df$dj,"%d/%m/%y")
df$exp <- as.Date(df$exp,"%d/%m/%y")
# The data in the file has different variable names than your example data
# so I'm changing them to match
names(df)[1:3] <- c("customer","dj","exp")
# Make a variable called Cohort that contains only the year and month of joining
# as.yearmon() comes from the 'zoo' package
df$Cohort <- as.yearmon(df$dj)
# Calculate the difference in months between date of expiry and date of joining
df$MonthDiff <- ceiling((df$exp-df$dj)/30)
#df$MonthDiff <- 12*(as.yearmon(df$exp+months(1))-df$Cohort)
# Use ddply() from the 'plyr' package to get the frequency of subjects that are
# still active after 0, 1, 2, 3, and 4 months.
df1 <- ddply(df,.(Cohort),summarize,
M0 = sum(MonthDiff > 0),
M1 = sum(MonthDiff > 1),
M2 = sum(MonthDiff > 2),
M3 = sum(MonthDiff > 3),
M4 = sum(MonthDiff > 4),
M5 = sum(MonthDiff > 5)
)
df1
df1
Cohort M0 M1 M2 M3 M4 M5
1 May 2015 3 3 2 0 0 0
2 Jun 2015 2 2 1 0 0 0
现在
答案 1 :(得分:0)
试试这个:
library(readxl)
library(zoo)
library(plyr)
# Read in the data
df <- read_excel("MyFile.xlsx")
# The data in the file has different variable names than your example data
# so I'm changing them to match
names(df)[1:3] <- c("customer","dj","exp")
# Make a variable called Cohort that contains only the year and month of joining
# as.yearmon() comes from the 'zoo' package
df$Cohort <- as.yearmon(df$dj)
# Calculate the difference in months between date of expiry and date of joining
df$MonthDiff <- 12*(as.yearmon(df$exp)-df$Cohort)
# Use ddply() from the 'plyr' package to get the frequency of subjects that are
# still active after 0, 1, 2, 3, and 4 months.
df1 <- ddply(df,.(Cohort),summarize,
M0 = sum(MonthDiff >= 0),
M1 = sum(MonthDiff >= 1),
M2 = sum(MonthDiff >= 2),
M3 = sum(MonthDiff >= 3),
M4 = sum(MonthDiff >= 4))
df1
# Cohort M0 M1 M2 M3 M4
# May 2015 3 3 2 0 0
# Jun 2015 2 1 0 0 0
这假定当您从Excel中读取数据时,日期将被格式化为日期。如果不是,您可以使用以下内容:
df$dj <- as.Date(df$dj,"%d/%m/%y")
df$exp <- as.Date(df$exp,"%d/%m/%y")