如何使用不同的日期列进行计算

时间:2014-10-20 16:15:56

标签: r date time

我有一个名为t_compl的df,其中包含三列日期。

date_op_indl    date_compl     usdato.x
1984-11-22  1984-11-22     1983-09-07
2004-11-16  NA             1994-10-27
1996-09-10  1996-09-10     1982-11-09
1986-05-24  1986-05-24     1982-11-22
1989-08-22  1989-06-13     1983-02-11

我想创建第四个变量(t_compl$time),其中年份的usdato.xdate_compldate_op_indl之间存在时差。我想从date_compldate_op_indl选择最早的日期。

我试过了

t_compl$time<- ifelse((t_compl$date_compl-t_compl$usdato.x)<=(t_compl$date_op_indl-t_compl$usdato.x), ((t_compl$date_compl-t_compl$usdato.x)/365.25), ((t_compl$date_op_indl-t_compl$usdato.x)/365.25))

由于缺少某些date_compl,我想使用compl_op_indl进行计算

t_compl$time[is.na(t_compl$time)] <- ((t_compl$date_op_indl-t_compl$usdato.x)/365.25)

然后出现此错误

Warning message:
In t_compl$time[is.na(t_compl$time)] <- ((t_compl$date_op_indl -  :
  number of items to replace is not a multiple of replacement length

compl_date NA的时间计算也完全错误。

如何在R?

中进行时差计算

2 个答案:

答案 0 :(得分:1)

DF <- read.table(text="date_op_indl    date_compl     usdato.x
1984-11-22  1984-11-22     1983-09-07
2004-11-16  NA             1994-10-27
1996-09-10  1996-09-10     1982-11-09
1986-05-24  1986-05-24     1982-11-22
1989-08-22  1989-06-13     1983-02-11", header=TRUE)

DF[] <- lapply(DF, as.Date)

使用pmin计算每次观察的最短日期(从而忽略NA值):

DF$time <- difftime(do.call(pmin, c(DF[, c("date_op_indl", "date_compl")], na.rm = TRUE)),
                    DF$usdato.x, units="days")
#   date_op_indl date_compl   usdato.x      time
# 1   1984-11-22 1984-11-22 1983-09-07  442 days
# 2   2004-11-16       <NA> 1994-10-27 3673 days
# 3   1996-09-10 1996-09-10 1982-11-09 5054 days
# 4   1986-05-24 1986-05-24 1982-11-22 1279 days
# 5   1989-08-22 1989-06-13 1983-02-11 2314 days

答案 1 :(得分:1)

这是另一种方法。我将角色转换为日期然后计算时差。既然你说你将使用年份作为单位,我在/365中有mutate

library(dplyr)

mydf %>%
    mutate_each(funs(as.Date(.))) %>%
    mutate(time = ifelse(date_compl %in% NA, (date_op_indl - usdato.x) / 365,
                     (date_compl - usdato.x) / 365))

#  date_op_indl date_compl   usdato.x      time
#1   1984-11-22 1984-11-22 1983-09-07  1.210959
#2   2004-11-16       <NA> 1994-10-27 10.063014
#3   1996-09-10 1996-09-10 1982-11-09 13.846575
#4   1986-05-24 1986-05-24 1982-11-22  3.504110
#5   1989-08-22 1989-06-13 1983-02-11  6.339726