根据 t+1 年 X 的值在 R 中创建保留变量
Creating a retention variable in R Based on the value of X in year t+1
我想在R中创建保留,数据如下:
ID为个人,t年参加。
Albert.Heijn
如果个人访问了 Albert Heijn,则为 1。
Albert.Heijnv1-7
是客户满意度衡量标准。
若Albert.Heijn
为NA
,则此人当年未到访公司,则满意度为NA
现在我需要创建一个保留变量,可能使用 for loop
。因为 ID 14401
= 2012 年的留存率,因为 2013 年的 Albert.Heijn
= 1。但是,同一个人在 2013 年没有留存率,因为缺少 2014 年。
同样在 2015 年,留存率将为 1,因为 2016 年 Albert.Heijn
= 1。对于 2016 年,留存率将为 0,因为没有 2017 年的数据可用。
最后,2016 年和 2013 年之后应该删除,因为如果没有连续年份的观察,则无法衡量留存率。
这需要为 180 多家不同的公司完成。
有人可以帮帮我吗?提前致谢。
这是一个可能的解决方案。您还需要为 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
}
}
}
我想在R中创建保留,数据如下:
ID为个人,t年参加。
Albert.Heijn
如果个人访问了 Albert Heijn,则为 1。
Albert.Heijnv1-7
是客户满意度衡量标准。
若Albert.Heijn
为NA
,则此人当年未到访公司,则满意度为NA
现在我需要创建一个保留变量,可能使用 for loop
。因为 ID 14401
= 2012 年的留存率,因为 2013 年的 Albert.Heijn
= 1。但是,同一个人在 2013 年没有留存率,因为缺少 2014 年。
同样在 2015 年,留存率将为 1,因为 2016 年 Albert.Heijn
= 1。对于 2016 年,留存率将为 0,因为没有 2017 年的数据可用。
最后,2016 年和 2013 年之后应该删除,因为如果没有连续年份的观察,则无法衡量留存率。
这需要为 180 多家不同的公司完成。
有人可以帮帮我吗?提前致谢。
这是一个可能的解决方案。您还需要为 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
}
}
}