2017-06-03 75 views
0

考慮這個數據集:求解基於一個標準的日期之間的差值

mydf <- data.frame(churn_indicator = c(0,0,1,0,1), resign_date = c(NA,NA,"2011-01-01",NA,"2012-02-01"), join_date = c("2001-01-01","2001-03-01","2002-04-02", "2003-09-01","2005-05-10"))

的任務是,以計算矢量「長度」是resign_date - 用於churn_indicator = 1和Sys.Date()join_date - churn_indicator = 0的join_date。

我已經想出瞭如何使用for循環來做到這一點,但我想使用更高效的應用程序(應用程序家族也許)。此外,是否有可能使用dplyr的mutate函數做到這一點?

回答

0

一個可能的解決方案:

# convert column from factor/characters to Date (if not already done) 
mydf$resign_date <- as.Date(mydf$resign_date) 
mydf$join_date <- as.Date(mydf$join_date) 

# compute the date differences 
days_churn1 <- as.numeric(difftime(mydf$resign_date,mydf$join_date,units='days')) 
days_churn0 <- as.numeric(difftime(Sys.Date(),mydf$join_date,units='days')) 

# set to zero the values where churn indicator is not what we want 
days_churn1[mydf$churn_indicator==0]<-0 
days_churn0[mydf$churn_indicator==1]<-0 

# sum the two vectors 
mydf$length <- days_churn1+days_churn0 

> mydf 
    churn_indicator resign_date join_date length 
1    0  <NA> 2001-01-01 5997 
2    0  <NA> 2001-03-01 5938 
3    1 2011-01-01 2002-04-02 3196 
4    0  <NA> 2003-09-01 5024 
5    1 2012-02-01 2005-05-10 2458 

或者,您可以使用ifelse結合一些操作:

# convert column from factor/characters to Date (if not already done) 
mydf$resign_date <- as.Date(mydf$resign_date) 
mydf$join_date <- as.Date(mydf$join_date) 

mydf$length <- 
as.numeric(
    ifelse(mydf$churn_indicator==1, 
     difftime(mydf$resign_date,mydf$join_date,units='days'), 
     difftime(Sys.Date(),mydf$join_date,units='days') 
))