Вычислять дни между последовательными датами в одном столбце

mrpargeter спросил: 12 мая 2018 в 05:20 в: r

У меня есть следующий фреймворк данных, содержащий столбец дат и столбец оценок:

dates<-c("2015-01-02","2015-01-10","2016-01-15")
assessments<-c('1','2','3')
dates_dataframe = data.frame(dates, assessments)
dates_dataframe$dates<-as.Date(dates_dataframe$dates)

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

Как мне это сделать?

3 ответа

YOLO ответил: 12 мая 2018 в 05:36

Другой способ - использовать функцию shift:

# create data
dates<-c("2015-01-02","2015-01-10","2016-01-15")
assessments<-c('1','2','3')
df <- data.table(dates, assessments)# convert to date format
df[, dates := as.Date(dates)]# shift
df[, next_dates := shift(dates, 1)]# get difference
df[, difference := abs(next_dates - dates)]        dates assessments next_dates difference
1: 2015-01-02           1       <NA>    NA days
2: 2015-01-10           2 2015-01-02     8 days
3: 2016-01-15           3 2015-01-10   370 days
useR ответил: 12 мая 2018 в 05:39

Вы можете сделать это с помощью diff:

dates_dataframe$days = c(0, diff(dates_dataframe$dates))
dates_dataframe$days2 = c(diff(dates_dataframe$dates), 0)

или с помощью NA:

dates_dataframe$days3 = c(NA, diff(dates_dataframe$dates))
dates_dataframe$days4 = c(diff(dates_dataframe$dates), NA_character_)

Результат:

> dates_dataframe
       dates assessments days    days2 days3    days4
1 2015-01-02           1    0   8 days    NA   8 days
2 2015-01-10           2    8 370 days     8 370 days
3 2016-01-15           3  370   0 days   370  NA days
Adam Warner ответил: 12 мая 2018 в 05:37

Я думаю, вы должны пойти с ответом useR, но вот еще один:

dates<-c("2015-01-02","2015-01-10","2016-01-15")
assessments<-c('1','2','3')
dates_dataframe <- cbind.data.frame(dates, assessments)
dates_dataframe$dates <- as.Date(dates_dataframe$dates)
dates_dataframe$dates_shift = shift(dates_dataframe$dates,1)
dates_dataframe$days <- (dates_dataframe$dates - dates_dataframe$dates_shift)   dates       assessments dates_shift  days
1 2015-01-02           1        <NA>  NA days
2 2015-01-10           2  2015-01-02   8 days
3 2016-01-15           3  2015-01-10 370 days