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