识别R中列的伙伴更改

时间:2018-05-09 00:02:07

标签: r dataframe

我正在处理纵向数据集,并且有兴趣确定离婚的个人何时与新合作伙伴结婚。我的数据集如下所示:

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)。

1 个答案:

答案 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)