【问题标题】:Creating a retention variable in R Based on the value of X in year t+1基于 t+1 年 X 的值在 R 中创建保留变量
【发布时间】:2017-11-28 08:56:54
【问题描述】:

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

ID 是个人,参与了 t 年。

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

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

如果Albert.HeijnNA,则该人当年没有去过公司,因此满意度测量值是NA

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

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

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

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

【问题讨论】:

  • 请使用dput而不是图像和预期输出来展示您的示例
  • 如果您的数据非常大,请使用:dput(head(YourData))
  • @MelvinBredewold 您可以创建一个包含重要变量的示例数据框。
  • 这是一小部分数据使用dput的例子,其中1=访问过的公司X,0=未访问过> dput(head(Book2)) structure(list(ID = c(13302) , 13302, 14401, 14401, 14401, 14401), Jaar = c(2012, 2015, 2012, 2013, 2015, 2016), Albert Heijn = c(1, 0, 1, 1, 1, 1), Aldi = c(1, 1, 0, 0, 0, 0), Bas van der Heijden = c(0, 0, 0, 0, 0, 0), Boni = c(0, 0, 0, 0, 0, 0) , C1000 = c(1, 0, 1, 1, 0, 0), Coop = c(0, 1, 0, 0, 0, 0), Deen = c(0, 0, 0, 0, 0, 0 ), DekaMarkt = c(0, 0, 0, 0, 0, 0), Digros = c(0, 0, 0, 0, 0, 0),

标签: r retention


【解决方案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
  }


}
}

【讨论】:

  • 嗨,芭芭拉,感谢您的代码,循环有效,并为我提供了有关保留的正确结果!还有一个小问题,我怎样才能将这个循环扩展到更多的观察和更多的变量?
  • @MelvinBredewold 我已经用ID 列的概括编辑了我的答案。如果要添加更多变量,可以在同一循环中添加它们以进行保留,因为无论变量/列如何,行数都是相同的。
  • 感谢您的代码。我最终通过以下循环解决了它: ID_list
  • ID==ID_list[j]) #subset(df, df$Year == (current_year[i]+1) & df$ID == ID_list[j] ) n_temp 0) if((subset(df,subset=(Year==(current_year[i,1]+1))&(ID==ID_list[j]),select="AH")= =1)&(subset(df,subset=(Year==(current_year[i,1]))&(ID==ID_list[j]),select="AH")==1)) #if(df [df$Year == (current_year[i,1]+1), "ID" ] == ID_list[j] & (df[df$Year == (current_year[i,1]+1), "AH" ] == 1))
  • { #subset(df,subset=(Year==current_year[i,1])&(ID==ID_list[j]),select="AHr") indx=which((df $Year == current_year[i,1]) & (df$ID == ID_list[j])) df[indx, "AHr"]
最近更新 更多