0

我想在 R 中创建一个保留,数据如下所示:

ID 是个人,参与了 t 年。

Albert.Heijn如果个人访问了 Albert Heijn,则为 1。

Albert.Heijnv1-7是客户满意度的衡量标准。

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

在此处输入图像描述

现在我需要创建一个保留变量,可能使用for loop. 因为ID 14401= 2012 年的保留,因为Albert.Heijn2013 年 = 1。但是,同一个人在 2013 年没有保留,因为缺少 2014 年。再次在 2015 年,留存率将为 1,因为Albert.Heijn2016 年 = 1。对于 2016 年,留存率将为 0,因为没有 2017 年的数据可用。

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

这需要为 180 多家不同的公司完成。

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

4

1 回答 1

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
  }


}
}
于 2017-11-28T11:42:10.390 回答