这是我的数据集的一部分:
ID year mrg_status
1 1990 2
1 1991 1
1 1992 1
1 1993 4
2 1990 2
2 1991 2
2 1992 1
3 1991 2
3 1992 1
3 1995 1
...
在mrg_status
中,2表示“单身”1表示“已婚”,4表示“离婚”。我想要做的是为每个ID计算marriage_tenure并添加第四列来记录它。结果应如下所示:
ID year mrg_status mrg_tenure
1 1990 2 0
1 1991 1 1
1 1992 1 2
1 1993 4 2
2 1990 2 0
2 1991 2 0
2 1992 1 1
3 1991 2 0
3 1992 1 1
3 1995 1 4
我试过了:
if(dt$mrg_status ==1){dt$mrg_tenure = sum(dt$mrg_status,by="ID"}
但这似乎完全是一团糟。一个重要的问题是如何处理mrg_status
= 4,它与前一年mrg_tenure
= 1的mrg_status
相同。我正在考虑编写一个循环,它可以检测“4”并停止累加mrg_tenure
。
答案 0 :(得分:1)
这就是我做的事情
df <- data.frame(
ID = c(1, 1, 1, 1, 2, 2, 2, 3, 3, 3),
year= c(1990, 1991, 1992, 1993, 1990, 1991, 1992, 1991, 1992, 1995),
mrg_status = c(2, 1, 1, 4, 2, 2, 1, 2, 1, 1)
)
mrg_tenure <- sapply(
X = split(df, df$ID), FUN = function(df1){
ifelse(
test = (df1$mrg_status == 2),
yes = 0,
no = ifelse(
test = (df1$mrg_status == 1),
yes = df1$year - max(df1[df1$mrg_status == 2, c('year')]),
no = max(df1[df1$mrg_status == 1, c('year')]) - max(df1[df1$mrg_status == 2, c('year')])
)
)
}
)
df$mrg_tenure <- do.call(c, mrg_tenure)
# ID year mrg_status mrg_tenure
# 1 1 1990 2 0
# 2 1 1991 1 1
# 3 1 1992 1 2
# 4 1 1993 4 2
# 5 2 1990 2 0
# 6 2 1991 2 0
# 7 2 1992 1 1
# 8 3 1991 2 0
# 9 3 1992 1 1
# 10 3 1995 1 4