R按数据帧列的周期增加日期

时间:2013-10-17 12:59:16

标签: r date seq

我正在尝试围绕测量时段进行一些测试。我想增加测量箱的大小(即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

如果我想要每月或每周的第一天,这显然是错误的。是否有针对此类问题的功能或包装?

编辑:

这:

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

2 个答案:

答案 0 :(得分:3)

听起来你正在寻找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')

答案 1 :(得分:1)

可能有更优雅的解决方案,但这应该有效 -

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"
)