R Увеличение дат по периодам в столбцах фрейма данных

Я пытаюсь провести некоторые тесты в отношении периодов измерения во времени. Я хотел бы увеличить размер ячеек измерения (например, 1 месяц против 2 месяцев и т. д.).

У меня есть фрейм данных с датой seq(), которая отлично работает, моя проблема заключается в увеличении даты на месяц, неделю и т. д.

df1 <- data.frame(id = 1:20, date1 = seq(as.Date('2012-01-01'),by = 'month', len = 20))
df1$date2 <- df1$date1 + 30

Это явно неправильно, если я хочу 1-го числа каждого месяца или недели. Есть ли функция или пакет для этого типа проблемы?

РЕДАКТИРОВАТЬ:

Этот :

seq( x, by = "month", length.out = 1)

кажется, работает для отдельных ячеек, но не будет работать для столбца, поскольку возвращает числовое значение:

df1$date2 <- sapply(df1$date1, function(x) seq( x, by = "month", length.out = 1))

> head(df1)
  id      date1 date2
1  1 2012-01-01 15340
2  2 2012-02-01 15371
3  3 2012-03-01 15400
4  4 2012-04-01 15431
5  5 2012-05-01 15461
6  6 2012-06-01 15492

person screechOwl    schedule 17.10.2013    source источник


Ответы (2)


Похоже, вы ищете cut:

df1$date2 <- cut(df1$date1 + as.difftime(31, units='days'), breaks='months')
df1$date3 <- cut(df1$date2 + as.difftime(1, units='weeks'), breaks='weeks')
person Matthew Plourde    schedule 17.10.2013
comment
так усердно работая над датами, A factor is returned, unless labels = FALSE which results in an integer vector of level codes. процитировать справку... Решение: обернуть все это as.Date ? - person PatrickT; 05.05.2016

Могут быть более элегантные решения, но это должно работать -

df1$date2 <- as.Date(
   paste(
      ifelse(
         strftime(df1$date1,'%m') == 12,  
         as.integer(strftime(df1$date1,'%Y')) + 1,
         as.integer(strftime(df1$date1,'%Y'))
      ),
      ifelse(
         strftime(df1$date1,'%m') == 12,  
         1,
         as.integer(strftime(df1$date1,'%m')) + 1
      ),
      1,
      sep = "-"
   ),
"%Y-%m-%d"
)
person TheComeOnMan    schedule 17.10.2013