在R中识别纵向数据集里离婚个体的新伴侣变更时点
解决纵向数据集里离婚个体新伴侣的识别问题
嘿,我正好能帮你搞定这个问题!核心难点确实是区分「真正的新伴侣获得」和各种0与非0的状态切换——比如第一次恋爱、离婚、复婚这些都不算我们要找的目标。先明确我们的判断规则(完全匹配你给出的期望输出):
我们只在以下两种情况标记为1(获得新伴侣):
- 前一个时间点有伴侣(非0),后一个时间点换了不同的伴侣(非0且编号不同)
- 前一个时间点是离婚后的单身(0,且该个体之前有过伴侣记录),后一个时间点有了新伴侣(非0)
同时排除这些情况:
- 从未有过伴侣的个体第一次获得伴侣(比如个体2的t4→t5)
- 从有伴侣变成单身(离婚,比如个体1的t1→t2)
- 复婚(回到之前的伴侣,比如个体1的t3→t4)
- 伴侣没有变化、持续单身这些情况
下面是具体的R代码实现,完全贴合你的数据集:
步骤1:加载原始数据集
# 加载你提供的数据集(注意把000改成0,R里会自动处理) df <- data.frame( t1 = c(100, 0, 0, 103, 0, 106), t2 = c(0, 0, 102, 103, 105, 0), t3 = c(0, 0, 102, 103, 0, 128), t4 = c(100, 0, 121, 103, 0, 0), t5 = c(100, 101, 121, 103, 105, 130) )
步骤2:标记每个个体的历史伴侣状态
我们先为每个时间点生成一个标记,判断该个体在这个时间点之前是否有过非0的伴侣记录——这能帮我们区分「从未有过伴侣的0」和「离婚后的0」:
# 生成每个时间点之前是否有过伴侣的矩阵 has_history <- t(apply(df, 1, function(x) { # 累积判断是否出现过非0,然后左移一位(对应当前时间点之前的状态) c(FALSE, cumsum(x != 0) > 0)[1:length(x)] })) colnames(has_history) <- colnames(df)
步骤3:计算相邻时间点的新伴侣标记
接下来我们逐行处理每个个体的相邻时间点,按照规则生成标记:
# 生成相邻时间对的列名(比如t1-t2对应t12) pair_cols <- paste0(colnames(df)[-ncol(df)], colnames(df)[-1]) # 逐行计算每个时间对的标记 result <- t(apply(df, 1, function(x) { # 获取当前个体的历史伴侣状态 hist_row <- has_history[which(apply(df, 1, function(y) all(y == x))), ] # 遍历每一对相邻时间点 sapply(1:(length(x)-1), function(i) { prev_val <- x[i] curr_val <- x[i+1] prev_has_history <- hist_row[i] # 按照规则判断 if (prev_val != 0 && curr_val != 0 && prev_val != curr_val) { # 情况1:更换了不同的伴侣 1 } else if (prev_val == 0 && curr_val != 0 && prev_has_history) { # 情况2:离婚后获得新伴侣 1 } else { # 其他所有情况都标记为0 0 } }) })) # 设置结果的列名 colnames(result) <- pair_cols
运行结果
执行完上面的代码后,你会得到和期望完全一致的结果:
> result t12 t23 t34 t45 [1,] 0 0 0 0 [2,] 0 0 0 0 [3,] 0 0 1 0 [4,] 0 0 0 0 [5,] 0 0 0 0 [6,] 0 1 0 1
规则调整说明
如果你之后需要调整判断规则(比如想把第一次获得伴侣也算进去),只需要修改else if里的条件就行——比如把prev_has_history的判断去掉,就能把从未有过伴侣的第一次恋爱也标记为1。
内容的提问来源于stack exchange,提问作者David Johnson
相关产品推荐
相关产品推荐

