2016-05-23 2 views
1

У меня есть набор данных в длинной форме для даты начала и окончания. для каждого идентификатора вы увидите несколько дат начала и окончания. Мне нужно найти разницу между первой датой окончания и второй датой начала. Я не уверен, как использовать две строки для вычисления разницы. Любая помощь приветствуется.Нахождение разницы между датами в длинном формате

df=data.frame(c(1,2,2,2,3,4,4), 
       as.Date(c("2010-10-01","2009-09-01","2014-01-01","2014-02-01","2009-01-01","2013-03-01","2014-03-01")), 
       as.Date(c("2016-04-30","2013-12-31","2014-01-31","2016-04-30","2014-02-28","2013-05-01","2014-08-31"))); 
names(df)=c('id','start','end') 

мой выход будет выглядеть следующим образом:

df$diff=c(NA,1,1,NA,NA,304, NA) 
+0

@latemail, что является правильным. Я отредактировал мой вопрос –

ответ

1

Вот альтернатива, используя популярный dplyr пакет:

library(dplyr) 
df %>% 
    group_by(id) %>% 
    mutate(diff = difftime(lead(start), end, units = "days")) 
#  id  start  end  diff 
# (dbl)  (date)  (date) (dfft) 
# 1  1 2010-10-01 2016-04-30 NA days 
# 2  2 2009-09-01 2013-12-31 1 days 
# 3  2 2014-01-01 2014-01-31 1 days 
# 4  2 2014-02-01 2016-04-30 NA days 
# 5  3 2009-01-01 2014-02-28 NA days 
# 6  4 2013-03-01 2013-05-01 304 days 
# 7  4 2014-03-01 2014-08-31 NA days 

Вы можете обернуть diff в as.numeric, если вы хотите.

1

Вот попытка в базе R, что я думаю, что делает то, что вы хотите:

df$diff <- NA 
split(df$diff, df$id) <- by(df, df$id, FUN=function(SD) c(SD$start[-1], NA) - SD$end) 

df 
# id  start  end diff 
#1 1 2010-10-01 2016-04-30 NA 
#2 2 2009-09-01 2013-12-31 1 
#3 2 2014-01-01 2014-01-31 1 
#4 2 2014-02-01 2016-04-30 NA 
#5 3 2009-01-01 2014-02-28 NA 
#6 4 2013-03-01 2013-05-01 304 
#7 4 2014-03-01 2014-08-31 NA 

В качестве альтернативы, в data.table было бы:

setDT(df)[, diff := shift(start,n=1,type="lead") - end, by=id] 
0

Опять с базой R, вы можете сделать следующее:

df$noofdays <- as.numeric(as.difftime(df$end-df$start, units=c("days"), format="%Y-%m-%d")) 
+0

Это не дает правильного результата. – thelatemail