我正在处理纵向数据集,并且有兴趣确定离婚的个人何时与新合作伙伴结婚。我的数据集如下所示:
data.frame(
t1 = c(100, 000, 000, 103, 000, 106),
t2 = c(000, 000, 102, 103, 105, 000),
t3 = c(000, 000, 102, 103, 000, 128),
t4 = c(100, 000, 121, 103, 000, 000),
t5 = c(100, 101, 121, 103, 105, 130)
)
产生以下内容:
t1 t2 t3 t4 t5
1 100 0 0 100 100
2 0 0 0 0 101
3 0 102 102 121 121
4 103 103 103 103 103
5 0 105 0 0 105
6 106 0 128 0 130
每行表示一个人。每列表示一个时间点。每个值表示当时他们的合作伙伴的数量。使这种分析变得复杂的原因是单身,离婚或没有参与数据收集浪潮的个人都有零。
我想知道的是一个人离婚后获得新伴侣的时间。理想情况下,我会得到一个t-1列的数据框,如下所示:
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
其中1表示一个人在波浪之间与新伙伴结婚。因此,第3人在第3波和第4波之间与新人结婚。第6人在第2波和第3波之间以及4比5之间与新人结婚。
我遇到的问题是,我尝试识别这些变化无法区分合作伙伴的转变(例如,第3个人的合作伙伴从102变为121)以及从无数据转移到某些数据(例如,第3个人的转变)从0到102),或从一些数据转换到没有数据(例如,人1从100转移到0)。
答案 0 :(得分:1)
这是使用tidyverse
套件的解决方案。基本思想是用特定的标签标记行,将数据重新整形为“长”格式,除去0,然后一次处理每个人。
对于每个人,我们确保数据点不是重复的,并且与第一个数据点不同(由于我们删除了所有零,因此它将为非零)。之后,我们只需将所有内容转换回原始的宽格式,然后删除/重新标记相应的列。
new_df <- df %>%
mutate(individual = 1:length(t1)) %>%
gather(time_point, status, -individual) %>%
mutate(
status = if_else(status == 0, NA_integer_, status %>% as.integer())
) %>%
na.omit() %>%
group_by(individual) %>%
mutate(
status = ((status != status[1]) & !duplicated(status))*1
) %>%
spread(time_point, status, fill = 0) %>%
ungroup() %>%
select(-individual, -t1, t12 = t2, t23 = t3, t34 = t4, t45 = t5)