2015-02-27 2 views
4

Мне нужно рассчитать количество дней, прошедших между несколькими датами, двумя способами, а затем выводить эти результаты в новые столбцы: i) количество дней, прошедших по сравнению с первой датой (например, РЕЗУЛЬТАТЫ $ ПЕРВЫЙ) и ii) между последовательными датами (например, РЕЗУЛЬТАТЫ $ МЕЖДУ). Вот пример с желаемыми результатами. Заранее спасибо.Рассчитать количество дней между двумя датами в r

library(lubridate) 

DATA = data.frame(DATE = mdy(c("7/8/2013", "8/1/2013", "8/30/2013", "10/23/2013", 
            "12/16/2013", "12/16/2015"))) 

RESULTS = data.frame(DATE = mdy(c("7/8/2013", "8/1/2013", "8/30/2013", "10/23/2013", 
             "12/16/2013", "12/16/2015")), 
        FIRST = c(0, 24, 53, 107, 161, 891), BETWEEN = c(0, 24, 29, 54, 54, 730)) 

ответ

5
#Using dplyr package 
library(dplyr) 
df1 %>% # your dataframe 
mutate(BETWEEN0=as.numeric(difftime(DATE,lag(DATE,1))),BETWEEN=ifelse(is.na(BETWEEN0),0,BETWEEN0),FIRST=cumsum(as.numeric(BETWEEN)))%>% 
select(-BETWEEN0) 
      DATE BETWEEN FIRST 
    1 2013-07-08  0  0 
    2 2013-08-01  24 24 
    3 2013-08-30  29 53 
    4 2013-10-23  54 107 
    5 2013-12-16  54 161 
    6 2015-12-16  730 891 
+2

Спасибо всем! Я должен был упомянуть об этом в вопросе, но я стараюсь как писать гибкий код (например, количество дат может меняться среди наборов данных), так и избегать циклов. Итак, хотя все ответы работали, ответ Metrics оказался наиболее гибким. Еще раз спасибо и позаботьтесь! – Vesuccio

0

Для первой части:

DATA = data.frame((c("7/8/2013", "8/1/2013", "8/30/2013", "10/23/2013","12/16/2013", "12/16/2015"))) 
names(DATA)[1] = "V1" 
date = as.Date(DATA$V1, format="%m/%d/%Y") 
print(date-date[1]) 

Результат:

[1] 0 24 53 107 161 891 

Для второй части - просто используйте for петлю

1

Это поможет вам, что вы хотите :

d <- as.Date(DATA$DATE, format="%m/%d/%Y") 

first <- c() 
for (i in seq_along(d)) 
    first[i] <- d[i] - d[1] 

between <- c(0, diff(d)) 

Эта функция использует в базовом пакете функцию as.Date(), чтобы передать вектор строковых дат в значения даты с использованием данного формата. Поскольку у вас есть даты как месяц/день/год, вы указываете format="%m/%d/%Y", чтобы убедиться, что оно правильно интерпретировано.

diff() - разница в запаздывании. Поскольку он отстает, он не включает разницу между элементом 1 и самим собой, поэтому вы можете объединить 0.

Различия между объектами Date указаны в днях по умолчанию.

Затем построение выходного dataframe прост:

RESULTS <- data.frame(DATE=DATA$DATE, FIRST=first, BETWEEN=between) 
0

Вы можете просто добавить каждую колонку с простым difftime и отставал diff расчетов.

DATA$FIRST <- c(0, 
       with(DATA, 
        difftime(DATE[2:length(DATE)],DATE[1], unit="days") 
        ) 
       ) 
DATA$BETWEEN <- c(0, 
        with(DATA, 
         diff(DATE[1:(length(DATE) - 1)], unit="days") 
         ) 
       ) 

identical(DATA, RESULTS) 
[1] TRUE 
Смежные вопросы