2014-06-26 38 views
1

我需要一種方法來比較格式化爲這樣dd/mm/yyyy與一個日期,當前字符串比較每個時,看起來像這樣yyyymmdd字符串轉換爲Date類,格式DD/MM/YYYY

日期的矢量我需要R鍵創建一個變量分配100如果該語句是TRUE和200,如果它是FALSE

爲了做到這一點,我創建了一個功能

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

功能應創建一個分配標誌100,如果tgt_date下降tmp_IDtmp_MD其他分配200,但標誌唐之間沒有正確分配。

Issue.dateMaturity.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_datetarget_dates_54是一樣的。

我需要R鍵藉此串並創建分配100到行的變量,其中"20110430"落在Issue.date範圍和Maturity.date 200應當以其它方式分配

我已確定了兩個可能的問題之間:

  1. ifelse可能不能夠比較一個日期與所述向量的每個元素
  2. 類的tgt_date需要被轉換成日期和格式應當DD /月/年

我還沒有找到解決任一問題的方法。任何建議非常感謝。 謝謝!

+0

是'x'數據框的單行嗎?或者它是多行? tgt_date是單個值還是矢量? – rrs

+0

x是數據框,tgt_date是單個值 – user3779916

+0

爲什麼不發佈一些數據。 – rrs

回答

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

你的函數需要單個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