在R中创建客户流失的二元响应变量

时间:2016-06-27 20:29:21

标签: r

我有以下excel文件:

CustomerID  year retained
1   2012    0
2   2013    0
3   2007    1
3   2008    1
3   2009    0
4   2010    0
5   2008    1
5   2009    0
6   2015    0
7   2014    0
8   2010    1
8   2011    1
8   2012    1
8   2013    0
9   2015    0
10  2015    0

在excel中,创建保留变量的命令是:IF(A2 = A3,1,0)。

我已经在互联网上的R和特别是这个伟大的网站上阅读了很多关于生存分析中的lapply,sapply和其他内容的例子 - 但是我在R中实现它时遇到了麻烦。我知道它会是这样的:

df["retained"] <- something

我能够使用以下代码成功计算任期:

df$tenure <- with(df,ave(CustomerID,CustomerID,FUN=seq_along))

但是我无法想出df [“保留”]的R代码应该是什么,并且我发现大多数其他Stackoverflow帖子在R方面更先进。所以希望除了解决之外我的问题是,这可以帮助那些在他们的努力中从excel到R的初步过渡。非常感谢提前。

3 个答案:

答案 0 :(得分:2)

这是一个稍微不正统的解决方案:

...
0.00001@0.02234
0.00280@0.00001
0.00022@0.03992
...

它的工作原理是测试 next df$retained <- c(+(df$CustomerID[-1L]==df$CustomerID[-nrow(df)]),0L); ## CustomerID year retained ## 1 1 2012 0 ## 2 2 2013 0 ## 3 3 2007 1 ## 4 3 2008 1 ## 5 3 2009 0 ## 6 4 2010 0 ## 7 5 2008 1 ## 8 5 2009 0 ## 9 6 2015 0 ## 10 7 2014 0 ## 11 8 2010 1 ## 12 8 2011 1 ## 13 8 2012 1 ## 14 8 2013 0 ## 15 9 2015 0 ## 16 10 2015 0 是否等于 previous CustomerID。如果为true,则保留当前行(对应于 previous CustomerID),因此值应为1.在(最近版本的)R中,您可以使用unary plus运算符将逻辑向量强制转换为整数向量,因此将unary plus应用于相等比较的结果,得1表示true,0表示false。

此外,我们必须手动补充生成的整数向量为零,因为最后一行没有 next CustomerID可以与之比较。

此解决方案仅在数据框架按CustomerID排序,然后按CustomerID排序时才有效。

答案 1 :(得分:2)

由于所有内容都按照CustomerID和年份进行排序,因此您可以将duplicatedfromLast参数一起使用:

df$retained = as.numeric(duplicated(df$CustomerID, fromLast = T))

答案 2 :(得分:0)

您可以实现一个简单的if else条件。我认为这将是这样的

for( i in 2:nrow(df)){

if(df[i,1] == df[i-1,1]){
    df[i,3] <- 1}
else 
    {df[i,3] <- 0}}