Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 使用NA值按日期范围展开数据框行_R_Date_Dplyr - Fatal编程技术网

R 使用NA值按日期范围展开数据框行

R 使用NA值按日期范围展开数据框行,r,date,dplyr,R,Date,Dplyr,有了下面的数据,我想扩展IndID因子的行或每个级别,以便在CptrDt和MortDt之间有尽可能多的行,包括起始年和结束年。对于没有MORTT的个人,我希望填写2017年之后的年份 dat <- data.frame(IndID = c("AAA","BBB","CCC"), CptrDt = as.Date(c("01-01-2013" ,"01-01-2013", "01-01-2014"),"%m-%d-%Y"),

有了下面的数据,我想扩展IndID因子的行或每个级别,以便在CptrDt和MortDt之间有尽可能多的行,包括起始年和结束年。对于没有MORTT的个人,我希望填写2017年之后的年份

dat <- data.frame(IndID = c("AAA","BBB","CCC"),
                 CptrDt  = as.Date(c("01-01-2013" ,"01-01-2013", "01-01-2014"),"%m-%d-%Y"),
                 MortDt =  as.Date(c("01-01-2015" ,"01-01-2016", NA),"%m-%d-%Y"))

> dat
  IndID     CptrDt     MortDt
1   AAA 2013-01-01 2015-01-01
2   BBB 2013-01-01 2016-01-01
3   CCC 2014-01-01       <NA>
dat-dat
独立的
1 AAA 2013-01-01 2015-01-01
2 BBB 2013-01-01 2016-01-01
3 CCC 2014-01-01
简化的结果将只返回如下所示的年份,但我可以使用其他日期格式

Result <- data.frame(IndID = c(rep("AAA",3), rep("BBB",4), rep("CCC",4)),
                 Year = c(2013,2014,2015,2013,2014,2015,2016,2014,2015,2016,2017))

   IndID Year
1    AAA 2013
2    AAA 2014
3    AAA 2015
4    BBB 2013
5    BBB 2014
6    BBB 2015
7    BBB 2016
8    CCC 2014
9    CCC 2015
10   CCC 2016
11   CCC 2017

Result1-使用
gsub
,从每一行中获取年份并形成一个序列。然后使用
expand.grid
按上述顺序展开
IndID
的值。最后,
rbind
将数据帧列表合并到一个数据帧中

dat[is.na(dat$CptrDt), "CptrDt"] <- as.Date("01-01-2017", "%m-%d-%Y")
dat[is.na(dat$MortDt), "MortDt"] <- as.Date("01-01-2017", "%m-%d-%Y")

do.call('rbind', apply(dat, 1, function(x) {
                                             pattern <- '([0-9]{4})-[0-9]{2}-[0-9]{2}';
                                             y <- as.numeric( gsub( pattern, '\\1', x[2:3] ) );
                                             expand.grid( IndID = x[1], 
                                                          Year = seq( y[1], y[2], by = 1 ) )
                                            }))

#    IndID Year
# 1    AAA 2013
# 2    AAA 2014
# 3    AAA 2015
# 4    BBB 2013
# 5    BBB 2014
# 6    BBB 2015
# 7    BBB 2016
# 8    CCC 2014
# 9    CCC 2015
# 10   CCC 2016
# 11   CCC 2017
数据:

dat <- data.frame(IndID = c("AAA","BBB","CCC"),
                  CptrDt  = as.Date(c("01-01-2013" ,"01-01-2013", "01-01-2014"),"%m-%d-%Y"),
                  MortDt =  as.Date(c("01-01-2015" ,"01-01-2016", NA),"%m-%d-%Y"))

dat1-使用
gsub
,从每一行中获取年份并形成一个序列。然后使用
expand.grid
按上述顺序展开
IndID
的值。最后,
rbind
将数据帧列表合并到一个数据帧中

dat[is.na(dat$CptrDt), "CptrDt"] <- as.Date("01-01-2017", "%m-%d-%Y")
dat[is.na(dat$MortDt), "MortDt"] <- as.Date("01-01-2017", "%m-%d-%Y")

do.call('rbind', apply(dat, 1, function(x) {
                                             pattern <- '([0-9]{4})-[0-9]{2}-[0-9]{2}';
                                             y <- as.numeric( gsub( pattern, '\\1', x[2:3] ) );
                                             expand.grid( IndID = x[1], 
                                                          Year = seq( y[1], y[2], by = 1 ) )
                                            }))

#    IndID Year
# 1    AAA 2013
# 2    AAA 2014
# 3    AAA 2015
# 4    BBB 2013
# 5    BBB 2014
# 6    BBB 2015
# 7    BBB 2016
# 8    CCC 2014
# 9    CCC 2015
# 10   CCC 2016
# 11   CCC 2017
数据:

dat <- data.frame(IndID = c("AAA","BBB","CCC"),
                  CptrDt  = as.Date(c("01-01-2013" ,"01-01-2013", "01-01-2014"),"%m-%d-%Y"),
                  MortDt =  as.Date(c("01-01-2015" ,"01-01-2016", NA),"%m-%d-%Y"))

dat您可以使用列表列或
do
库(tidyverse);dat%>%group by(IndID)%%>%mutate(MortDt=coalesce(MORTT,Sys.Date()),Year=seq(CptrDt,MortDt,by='Year')%%>%lubridate::Year()%%>%unnest()
或使用
purrr::by_slice
dat group by(IndID)%%>%%%>%lubridate::year(),.collate='rows',.to='year')
您可以使用列表列或
do
库(tidyverse);dat%>%group by(IndID)%%>%mutate(MortDt=coalesce(MORTT,Sys.Date()),Year=seq(CptrDt,MortDt,by='Year')%%>%lubridate::Year()%%>%unnest()
或使用
purrr::by_slice
dat group by(IndID)%%>%%%>%lubridate::year(),.collate='rows',.to='year')
不要使用正则表达式解析日期;只需将
格式
%Y
@alistaire一起使用,谢谢您的评论。我在回答中添加了它,不使用正则表达式解析日期;只需将
格式
%Y
@alistaire一起使用,谢谢您的评论。我在答案中加了它