我确信这很简单,我似乎找不到办法。我希望转换一个数据框,其中列出了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)
答案 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,它将在数据的最小和最大年份之间添加所有年份。最后,它将数据转换为宽格式。