在R中创建保留变量基于年t + 1中的X值

时间:2017-11-28 08:56:54

标签: r retention

我想在R中创建保留,数据如下:

ID是参加t年的个人。

如果个人访问了Albert Heijn,则

Albert.Heijn为1。

Albert.Heijnv1-7是客户满意度测量值。

如果Albert.HeijnNA,那个人在那一年没有访问过该公司,因此满意度测量为NA

enter image description here

现在我需要创建一个保留变量,可能使用for loop。由于ID 14401 = 2012年的保留期,因为2013年的Albert.Heijn = 1。但是,由于2014年缺失,2013年同一人未获得保留。 在2015年,保留率将为1,因为2016年Albert.Heijn = 1。2016年保留率为0,因为2017年没有数据可用。

最后,2016年和2013年之后应该删除,因为如果没有连续一年的观察,则无法衡量保留。

这需要针对180多家不同的公司进行。

有人可以帮帮我吗?提前谢谢。

1 个答案:

答案 0 :(得分:1)

这是一种可能的解决方案。您还需要为ID创建一个循环。

示例数据

df <- data.frame("ID" = c(1,1,2,2,2,2), "Year" = c(2012, 2015,2012,2013,2015,2016), "AH" = c(1, NA, 1,1,1,1))

ID == 2的代码

current_year <- df[df$ID == 2, "Year"]
n <- length(current_year)
i = 0
df$retention <- 0
while(i<n){
  i = i + 1

  df_temp <- subset(df, df$Year == (current_year[i]+1) & df$ID == 2 )
  n_temp <- nrow(df_temp)
  if(n_temp>0)
  if(df[df$Year == (current_year[i]+1), "ID" ] == 2 & df[df$Year == (current_year[i]+1), "AH"] == 1)
  {
    df[df$Year == current_year[i] & df$ID == 2, "retention"] <- 1
  }


}

编辑 - 更一般的代码

如果要为所有ID推广它,则需要创建唯一ID列表,计算ID数并执行while循环。代码

df <- data.frame("ID" = c(1,1,2,2,2,2), "Year" = c(2012, 2015,2012,2013,2015,2016), "AH" = c(1, NA, 1,1,1,1))

ID_list <- unique(df$ID)

n_ID <- length(ID_list)

j = 0

while(j < n_ID)
{
  j = j + 1
current_year <- df[df$ID == ID_list[j], "Year"]
n <- length(current_year)
i = 0
df$retention <- 0
while(i<n){
  i = i + 1

  df_temp <- subset(df, df$Year == (current_year[i]+1) & df$ID == ID_list[j] )
  n_temp <- nrow(df_temp)
  if(n_temp>0)
  if(df[df$Year == (current_year[i]+1), "ID" ] == ID_list[j] & df[df$Year == (current_year[i]+1), "AH"] == 1)
  {
    df[df$Year == current_year[i] & df$ID == ID_list[j], "retention"] <- 1
  }


}
}