按年份(包括缺少的年份)将数据框转换为存在状态

时间:2019-02-06 11:21:28

标签: r

我确信这很简单,我似乎找不到办法。我希望转换一个数据框,其中列出了ID号,首次联系的年份以及随后的每个联系年份。我希望将每个唯一ID的状态转换为每年的存在状态(以便进行生存分析),但还要包括数据集中缺少的年份(这是其他类似问题的答案似乎对我没有帮助的地方)。我是否只需要手动添加缺少的年份,然后使用某种匹配功能?预先非常感谢。

errgroup

我有一个联系年份和开始年份的数据框,希望将其转换为存在/不存在的数据框

library(tidyverse)

我首先确定了每个ID的开始年份和结束年份

dat0<-data.frame(ID=c(1,1,1,2,2,2,2,3,3,4,4,4,4,4,5,5,5),Contact_yr=c(1990,1991,1992,1994,1996,1997,2000,1998,1999,2001,2003,2006,2007,2008,2010,2012,2014),Start_yr=c(1989,1989,1989,1993,1993,1993,1993,1997,1997,2000,2000,2000,2000,2000,2009,2009,2009))

我试图使用传播来获取数据帧,但这不太正确

dat1<-dat0 %>%
group_by(ID) %>%
mutate(first = first(Start_yr),
last = last(Contact_yr))%>% 
distinct(ID, .keep_all = TRUE) %>%
select(ID,first,last)

这是我追求的结构:

dat1 %>% 
spread(first,last)

1 个答案:

答案 0 :(得分:0)

一种tidyverse可能是:

dat0 %>%
 gather(var, val, -ID) %>%
 group_by(ID) %>%
 distinct(val, .keep_all = TRUE) %>%
 ungroup() %>%
 mutate(var = 1) %>%
 complete(ID, nesting(val = full_seq(val, 1))) %>%
 spread(val, var, fill = 0)

     ID `1989` `1990` `1991` `1992` `1993` `1994` `1995` `1996` `1997` `1998`
  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
1    1.     1.     1.     1.     1.     0.     0.     0.     0.     0.     0.
2    2.     0.     0.     0.     0.     1.     1.     0.     1.     1.     0.
3    3.     0.     0.     0.     0.     0.     0.     0.     0.     1.     1.
4    4.     0.     0.     0.     0.     0.     0.     0.     0.     0.     0.
5    5.     0.     0.     0.     0.     0.     0.     0.     0.     0.     0.
# ... with 16 more variables: `1999` <dbl>, `2000` <dbl>, `2001` <dbl>,
#   `2002` <dbl>, `2003` <dbl>, `2004` <dbl>, `2005` <dbl>, `2006` <dbl>,
#   `2007` <dbl>, `2008` <dbl>, `2009` <dbl>, `2010` <dbl>, `2011` <dbl>,
#   `2012` <dbl>, `2013` <dbl>, `2014` <dbl>

首先,将数据从宽格式转换为长格式。其次,每个ID仅保留不同的年份。第三,对于每个ID,它将在数据的最小和最大年份之间添加所有年份。最后,它将数据转换为宽格式。