Начнем с некоторых фиктивных данных:
start <- as.Date("2010/01/01")
end <- as.Date("2010/12/31")
set.seed(1)
datewant <- seq(start, end, by = "days")[sample(15)]
tmpTimes <- data.frame(EntryTime = datewant,
ExitTime = datewant + sample(100, 15))
## reorder on EntryTime so in random order
tmpTimes <- tmpTimes[sample(NROW(tmpTimes)), ]
head(tmpTimes)
, поэтому у нас будет что-то вроде этого:
> head(tmpTimes)
EntryTime ExitTime
8 2010-01-14 2010-03-16
9 2010-01-05 2010-01-17
7 2010-01-10 2010-01-30
3 2010-01-08 2010-04-16
10 2010-01-01 2010-01-26
13 2010-01-12 2010-02-15
Используя вышеизложенное, посмотрите на Цель 1 , вычислитеРазница между самой ранней и последней датой.Вы можете обрабатывать даты, как если бы они были числами (так они и хранятся внутри), поэтому будут работать такие функции, как min()
и max()
.Вы можете использовать функцию difftime()
:
> with(tmpTimes, difftime(max(EntryTime), min(EntryTime)))
Time difference of 14 days
или использовать стандартное вычитание
> with(tmpTimes, max(EntryTime) - min(EntryTime))
Time difference of 14 days
, чтобы получить разницу в днях.head()
и tail()
будут работать только в том случае, если вы отсортируете даты, поскольку они принимают первое и последнее значения в векторе, а не самое высокое и самое низкое действительные значения.
Цель 2: Вы, кажется, пытаетесь преобразовать фрейм данных в дату.Вы не можете сделать это.Что вы можете сделать, это переформатировать данные в компонентов фрейма данных.Здесь я добавляю столбцы к tmpTimes
, переформатируя столбец EntryTime
в несколько различных сводок даты.
tmpTimes2 <- within(tmpTimes, weekOfYear <- format(EntryTime, format = "%W-%Y"))
tmpTimes2 <- within(tmpTimes2, monthYear <- format(EntryTime, format = "%B-%Y"))
tmpTimes2 <- within(tmpTimes2, Year <- format(EntryTime, format = "%Y"))
Предоставление:
> head(tmpTimes2)
EntryTime ExitTime weekOfYear monthYear Year
8 2010-01-14 2010-03-16 02-2010 January-2010 2010
9 2010-01-05 2010-01-17 01-2010 January-2010 2010
7 2010-01-10 2010-01-30 01-2010 January-2010 2010
3 2010-01-08 2010-04-16 01-2010 January-2010 2010
10 2010-01-01 2010-01-26 00-2010 January-2010 2010
13 2010-01-12 2010-02-15 02-2010 January-2010 2010
Если вы американец или хотитеиспользуйте соглашение США для начала недели (%W
начинает неделю с понедельника, в США - с воскресенья), измените %W
на %U
.?strftime
содержит более подробную информацию о том, что представляют %W
и %U
.
Последнее замечание о формате данных: Выше я работал с датами в стандарте Rформат.Ваши данные хранятся во фрейме данных в нестандартной разметке, предположительно в виде символов или факторов.Итак, у вас есть что-то вроде:
tmpTimes3 <- within(tmpTimes,
EntryTime <- format(EntryTime, format = "%d-%m-%y"))
tmpTimes3 <- within(tmpTimes3,
ExitTime <- format(ExitTime, format = "%d-%m-%y"))
> head(tmpTimes3)
EntryTime ExitTime
8 14-01-10 16-03-10
9 05-01-10 17-01-10
7 10-01-10 30-01-10
3 08-01-10 16-04-10
10 01-01-10 26-01-10
13 12-01-10 15-02-10
Вам нужно преобразовать эти символы или факторы во что-то, что R понимает как дату.Я бы предпочел класс "Date"
.Прежде чем вы попробуете приведенные выше ответы со своими данными, преобразуйте ваши данные в правильный формат:
tmpTimes3 <-
within(tmpTimes3, {
EntryTime <- as.Date(as.character(EntryTime), format = "%d-%m-%y")
ExitTime <- as.Date(as.character(ExitTime), format = "%d-%m-%y")
})
, чтобы ваши данные выглядели так:
> head(tmpTimes3)
EntryTime ExitTime
8 2010-01-14 2010-03-16
9 2010-01-05 2010-01-17
7 2010-01-10 2010-01-30
3 2010-01-08 2010-04-16
10 2010-01-01 2010-01-26
13 2010-01-12 2010-02-15
> str(tmpTimes3)
'data.frame': 15 obs. of 2 variables:
$ EntryTime:Class 'Date' num [1:15] 14623 14614 14619 14617 14610 ...
$ ExitTime :Class 'Date' num [1:15] 14684 14626 14639 14715 14635 ...