我需要一种方法来比较格式为dd/mm/yyyy
格式的日期向量和单个日期,目前这个字符串看起来像yyyymmdd
比较每个向量元素时,我需要R来创建一个变量,如果语句是TRUE
则分配100,如果是FALSE
则分配200
为了做到这一点,我创建了一个函数
tmp_ID
和tmp_MD
是我的日期向量
tgt_date
是我需要比较的单一日期
功能:
select_alive<-function(x){
tmp_ID <- as.Date(x$Issue.date,sep="","%d/%m/%Y")
tmp_MD <- as.Date(x$Maturity.date,"%d/%m/%Y")
tgt_date <- format.Date(as.Date(target_dates_54,"%Y%m%d","%d-%m-%Y"), "%d/%m/%Y")
Security.Status <-ifelse((tgt_date < tmp_MD) & (tgt_date >= tmp_ID), 100,200)
x<-cbind(x,Security.Status)
return(x)
}
该函数应创建一个标记,如果tgt_date
落在tmp_ID
和tmp_MD
之间,则分配100,否则分配200,但标记不能正确分配。
Issue.date
和Maturity.date
属于数据框,如下所示
Issue.date Maturity.date
06/11/2003 07/11/2033
01/04/2011 NA
03/02/2011 23/03/2012
02/01/2006 02/01/2011
19/11/2010 25/03/2011
target_dates_54
是包含日期
target_dates_54 <- c("20110131","20110228","20110331","20110430".....)
为简单起见,我们假设它只包含一个字符串"20110430"
因此,在这种情况下,tgt_date
和target_dates_54
是相同的。
我需要R来获取此字符串并创建一个变量,该变量将{100}分配给"20110430"
介于Issue.date
和Maturity.date
之间的行
否则应分配200
我发现了两个可能的问题:
tgt_date
需要转换为日期,格式应为dd / mm / yyyy 我还没有找到解决其中任何一个问题的方法。任何建议都非常感谢。 谢谢!
答案 0 :(得分:3)
假设tgt_date
是单个值(不是向量),请尝试:
library(lubridate)
x <- transform(x, Issue.date = dmy(Issue.date), Maturity.date = dmy(Maturity.date))
tgt_date <- ymd(tgt_date)
x <- mutate(x, Security.Status = ifelse((tgt_date < Maturity.date) & (tgt_date >= Issue.date), 100, 200))
使用您提供的数据:
> x
Issue.date Maturity.date Security.Status
1 2003-11-06 2033-11-07 100
2 2011-04-01 <NA> NA
3 2011-02-03 2012-03-23 100
4 2006-01-02 2011-01-02 200
5 2010-11-19 2011-03-25 200
注意:我正在使用lubridate
包来转换日期。
答案 1 :(得分:1)
您的功能需要对单个target_date
select_alive<-function(x, target_date){
tmp_ID <- as.Date(x$Issue.date,sep="","%d/%m/%Y")
tmp_MD <- as.Date(x$Maturity.date,"%d/%m/%Y")
tgt_date <- as.Date(target_date,"%Y%m%d") ######
Security.Status <-ifelse((tgt_date < tmp_MD) & (tgt_date >= tmp_ID), 100,200)
x<-cbind(x,Security.Status)
return(x)
}
target_date <- "20110430"
select_alive(x, target_date)
#Issue.date Maturity.date Security.Status
#1 06/11/2003 07/11/2033 100
#2 01/04/2011 <NA> NA
#3 03/02/2011 23/03/2012 100
#4 02/01/2006 02/01/2011 200
#5 19/11/2010 25/03/2011 200
对于多个日期,我不清楚这种情况。也许,可以使用?cut
。