我有以下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的初步过渡。非常感谢提前。
答案 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和年份进行排序,因此您可以将duplicated
与fromLast
参数一起使用:
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}}