根据另一个日期将数字转换为日期

时间:2014-10-09 17:45:36

标签: r date if-statement

我需要将一个数字转换为完整的一天,具体取决于另一个日期。由于我分析的动作是在变量" fechafin"之后一天开始的。而且我预测一天不是约会,我需要将它改为约会,但如果我说第7次就必须:2014-07-07,如果我说第3次,则必须是2014年-08-03。

以下是一个例子:

final_muestra1<-data.frame(prior_day1=c(1:17) )

fechafin=as.Date('2014-07-06')

所以我定义了一个函数:

add.months= function(date,n) seq(date, by = paste (n, "months"), length = 2)[2]

并且行动的第一天将是:

diapri<-as.numeric(format(fechafin+1, "%d"))       

然后我需要计算我预测的日历日期,所以我使用了ifelse(因为我有NA我添加了另一个ifelse)

final_muestra1$prior_day1_comp<-
  ifelse(!is.na(final_muestra1$prior_day1), 
            ifelse( final_muestra1$prior_day1>=diapri, 
                                 fechafin-diapri+final_muestra1$prior_day1, 
                                  add.months((fechafin-diapri+final_muestra1$prior_day1),1)),NA) 

我收到以下错误:

  

seq.Date中的错误(date,by = paste(n,&#34; months&#34;),length = 2):
  &#39;从&#39;必须长度为1

我需要获得下表:

   prior_day1 prior_day1_comp
1           1  2014-08-01
2           2  2014-08-02
3           3  2014-08-03
4           4  2014-08-04
5           5  2014-08-05
6           6  2014-08-06
7           7  2014-07-07
8           8  2014-07-08

2 个答案:

答案 0 :(得分:1)

我用另一种方式解决(可怕): 我创建了另一个日期:

fecha_fin_cart=as.Date('2014-08-06')

diapri<-as.numeric(format(fechafin+1, "%d"))       



fechafin_pri<-as.Date(format(fechafin, "%Y-%m-01"))

fecha_fin_cart<-as.Date(format(fecha_fin_cart, "%Y-%m-01"))

创建了另一个功能:

gg<-function(d) {
  NAs <- is.na(d)
  august <- (!is.na(d) & d <= diapri)
  july <- (!is.na(d) & d > diapri)

  ret <- rep(as.Date("2014-01-01"), length(d))
  ret[august] <- (fecha_fin_cart) + (d[august]-1)
  ret[!august] <-(fechafin_pri) + (d[!august]-1)
  return(ret) 
}




final_muestra1$xx<-gg(final_muestra1$prior_day1)

然后:

final_muestra1
 prior_day1         xx
1           1 2014-08-01
2           2 2014-08-02
3           3 2014-08-03
4           4 2014-08-04
5           5 2014-08-05
6           6 2014-08-06
7           7 2014-07-07
8           8 2014-07-08
9           9 2014-07-09
10         10 2014-07-10
11         11 2014-07-11
12         12 2014-07-12
13         13 2014-07-13
14         14 2014-07-14
15         15 2014-07-15
16         16 2014-07-16
17         17 2014-07-17
18         NA       <NA>

答案 1 :(得分:0)

我调试了您之前的代码。检查这是否正常:

library(chron)
final_muestra1<-data.frame(prior_day1=c(1:17) )
fechafin=as.Date('2014-07-06')
diapri<-as.numeric(format(fechafin, "%d"))  
add.months= function(date) seq(chron(as.numeric(date)), by = "months", length = 2)[2]

for (i in 1:nrow(final_muestra1)){a[i]<-ifelse(!is.na(final_muestra1$prior_day1[i]),ifelse( final_muestra1$prior_day1[i]>diapri, fechafin-diapri+final_muestra1$prior_day1[i], add.months(fechafin-diapri+final_muestra1$prior_day1[i])),NA)}

final_muestra1$prior_day1_comp<-a

final_muestra1