r - 按年份将数据框转换为存在缺席(包括缺失年份)
问题描述
我确信这很简单,我似乎找不到方法。我希望转换一个列出 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))
解决方案
一种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,它会添加数据中最小年份和最大年份之间的所有年份。最后,它将数据转换为宽格式。
推荐阅读
- regex - 正则表达式在某些单词后获取值
- mysql - Python:将 SQL 查询的日志记录添加到 Web 服务器的函数
- html - 调整窗口大小时,滑块图像未占用全宽,因此出现了一些背景空间
- c# - 在某些字符列名隐藏在 oledb 之后
- javascript - 用于创建和填充 k6 指标的函数
- r - 尝试按间隔过滤行并绘制获得的行数
- html - 属性名称不能为 null 或为空。ThemeLeaf 与 Spring 相关
- powershell - 此命令不可用。通过使用 Powershell 写入 Word
- machine-learning - 应用平滑的目标编码后如何转换测试数据?
- python - gevent.sleep(0) 的 asyncio 中的等价物是什么