2014-10-20 4 views
1

У меня есть df, называемый t_compl с тремя столбцами дат.Как рассчитать с разными столбцами дат

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.x и date_compl или date_op_indl в годы. Я хочу выбрать самую раннюю дату из date_compl и date_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?

+0

Вы хотите получить результат целыми годами или годами-месяцами? 'difftime' может быть очень полезен для вас здесь. –

+0

Мне нужна точная разница во времени во времени. Я выбираю годы, потому что у меня есть период наблюдения 30 лет. – Daniel

ответ

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 
+0

Это работает, спасибо :) – Daniel

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 
+0

И этот тоже работает :) Отличный вариант! – Daniel