R - как мне объявить вектор даты? - PullRequest
13 голосов
/ 21 июля 2011

Например, я попробовал следующее, чтобы создать вектор дат, длиной 5. Нет работы:

date(5)
Date(5)
vector(5, mode = "Date" )

Это работает, но интересно, есть ли ярлык?

as.Date( numeric( 5 ) )

Кроме того, я вижу, что режим (as.Date ("2011-01-01")) является числовым, и я понимаю, что базовая структура данных для дат числовая, но учитывая, что vector () имеет только аргумент mode и lengthмне кажется, что невозможно создать вектор Date без принуждения?

Edit
Это тоже решение, кроме длины = 0?

Date = function( length = 0 )
{
   newDate = numeric( length )
   class(newDate) = "Date"
   return(newDate)
}

Ответы [ 2 ]

17 голосов
/ 21 июля 2011

Вы можете использовать последовательность или просто добавить:

R> seq( as.Date("2011-07-01"), by=1, len=3)
[1] "2011-07-01" "2011-07-02" "2011-07-03"
R> as.Date("2011-07-01") + 0:2
[1] "2011-07-01" "2011-07-02" "2011-07-03"
R> 

и то, что оба работают одинаково, является хорошей иллюстрацией того, почему объектная ориентация хороша для программирования с данными.

Дата, как вы видели, имеет базовое числовое представление (целых чисел, представляющих количество дней с начала времени Unix, 1 января 1970 г.), но также имеет атрибут класса, который делает форматирование арифметическим. .. вести себя так, как использует механизм диспетчеризации в R.

Редактировать: Таким же токеном вы также можете начать со стандартного вектора и превратить его в Date объект:

R> x <- 1:3
R> class(x) <- "Date"
R> x
[1] "1970-01-02" "1970-01-03" "1970-01-04" 
R> 
5 голосов
/ 09 июня 2015

Инициализировать с отсутствующими датами вместо набора 1970-01-01:

(x = structure(rep(NA_real_, 10 ), class="Date"))
# [1] NA NA NA NA NA NA NA NA NA NA
class(x)
# [1] "Date"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...