1

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

2 回答 2

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')
于 2013-10-17T13:56:24.637 回答
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"
)
于 2013-10-17T13:20:42.690 回答