首页 > 解决方案 > 按年份将数据框转换为存在缺席(包括缺失年份)

问题描述

我确信这很简单,我似乎找不到方法。我希望转换一个列出 ID 号、第一次联系的年份和每个后续联系年份的数据框。我希望将其转换为每个唯一 ID 的每年存在(以促进生存分析),但也包括数据集中缺失的年份(这是类似问题的其他答案似乎对我没有帮助的地方)。我是否只需要手动添加缺少的年份,然后使用某种匹配功能?提前谢谢了。

library(tidyverse)

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

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

我首先计算每个 ID 的开始年份和最后一年

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

我尝试使用 spread 来获取数据框,但这不太正确

dat1 %>% 
spread(first,last)

这是我所追求的结构:

what_I_want<-data.frame(ID=c(1,2,3,4,5),
                        "1989"=c(1,0,0,0,0),
                        "1990"=c(1,0,0,0,0),    
                        "1991"=c(1,0,0,0,0),    
                        "1992"=c(1,0,0,0,0),    
                        "1993"=c(0,1,0,0,0),    
                        "1994"=c(0,1,0,0,0),    
                        "1995"=c(0,0,0,0,0),    
                        "1996"=c(0,1,0,0,0),    
                        "1997"=c(0,1,1,0,0),    
                        "1998"=c(0,0,1,0,0),    
                        "1999"=c(0,0,1,0,0),    
                        "2000"=c(0,0,1,1,0),    
                        "2001"=c(0,0,0,1,0),    
                        "2002"=c(0,0,0,0,0),    
                        "2003"=c(0,0,0,1,0),    
                        "2004"=c(0,0,0,0,0),    
                        "2005"=c(0,0,0,0,0),    
                        "2006"=c(0,0,0,1,0),    
                        "2007"=c(0,0,0,1,0),    
                        "2008"=c(0,0,0,1,0),    
                        "2009"=c(0,0,0,0,1),    
                        "2010"=c(0,0,0,0,1),    
                        "2011"=c(0,0,0,0,0),    
                        "2012"=c(0,0,0,0,1),    
                        "2013"=c(0,0,0,0,0),    
                        "2014"=c(0,0,0,0,1))

标签: r

解决方案


一种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,它会添加数据中最小年份和最大年份之间的所有年份。最后,它将数据转换为宽格式。


推荐阅读