使用回滚和lubridate获取NA值

使用回滚和lubridate获取NA值,r,lubridate,R,Lubridate,下面的mutate函数哪里出了问题 我想将日期回滚到月底,但对于某些月份,它只返回NA值 date date2 1 2014-01-31 <NA> 2 2014-02-28 2014-02-28 3 2014-03-31 <NA> 4 2014-04-30 2014-04-30 5 2014-05-30 2014-05-31 6 2014-06-30 2014-06-30 7 2014-07

下面的
mutate
函数哪里出了问题

我想将日期回滚到月底,但对于某些月份,它只返回NA值

          date      date2
1   2014-01-31       <NA>
2   2014-02-28 2014-02-28
3   2014-03-31       <NA>
4   2014-04-30 2014-04-30
5   2014-05-30 2014-05-31
6   2014-06-30 2014-06-30
7   2014-07-31 2014-07-31
8   2014-08-29 2014-08-31
9   2014-09-30 2014-09-30
10  2014-10-31       <NA>
数据:


mydates您需要使用
%m++
而不是
++

mydates  %>% 
   mutate(date2 = rollback(parse_date(date, "%Y-%m-%d") %m+% months(1)))
#          date      date2
# 1  2014-01-31 2014-01-31
# 2  2014-02-28 2014-02-28
# 3  2014-03-31 2014-03-31
# 4  2014-04-30 2014-04-30
# 5  2014-05-30 2014-05-31
# 6  2014-06-30 2014-06-30
# 7  2014-07-31 2014-07-31
# 8  2014-08-29 2014-08-31
# 9  2014-09-30 2014-09-30
# 10 2014-10-31 2014-10-31

help('%m+%')
添加月份会阻碍基本算法,因为连续的月份 有不同的长度。与其他元素一起,它有助于 执行自动翻滚的算法。例如,12:00:00+61 秒变成12:01:01。然而,人们往往更喜欢这样 行为不会在几个月内发生。例如,我们有时想要一月 31+1个月=2月28日,而不是3月3日m+%执行这种类型的操作 算术。日期%m+%months(n)始终返回第n个月的日期 在日期之后。如果新日期通常会溢出到n+1 月份,%m+%将返回第n个月的最后一天(回滚()。 日期%m-%months(n)始终返回前n个月的日期 日期


您需要使用
%m++
而不是
++

mydates  %>% 
   mutate(date2 = rollback(parse_date(date, "%Y-%m-%d") %m+% months(1)))
#          date      date2
# 1  2014-01-31 2014-01-31
# 2  2014-02-28 2014-02-28
# 3  2014-03-31 2014-03-31
# 4  2014-04-30 2014-04-30
# 5  2014-05-30 2014-05-31
# 6  2014-06-30 2014-06-30
# 7  2014-07-31 2014-07-31
# 8  2014-08-29 2014-08-31
# 9  2014-09-30 2014-09-30
# 10 2014-10-31 2014-10-31

help('%m+%')
添加月份会阻碍基本算法,因为连续的月份 有不同的长度。与其他元素一起,它有助于 执行自动翻滚的算法。例如,12:00:00+61 秒变成12:01:01。然而,人们往往更喜欢这样 行为不会在几个月内发生。例如,我们有时想要一月 31+1个月=2月28日,而不是3月3日m+%执行这种类型的操作 算术。日期%m+%months(n)始终返回第n个月的日期 在日期之后。如果新日期通常会溢出到n+1 月份,%m+%将返回第n个月的最后一天(回滚()。 日期%m-%months(n)始终返回前n个月的日期 日期


您的问题在于
+月份(1)
,因此当您尝试将其添加到(比如)
“2005-03-31”
时,您可能会认为您可能会得到
“2005-04-31”
,它不是日期,并且不清楚您是否想要
“2005-04-30”
“2005-05-01”
,因此
NA
可能更安全。请注意,将月份添加到7月31日或12月31日不会出现此问题。或者你可以考虑Azhashla删除的帖子,改变BrkeTySyt问题是用<代码> +月(1)< /代码>,所以当你尝试添加到(例如)代码>“2005—03-31”< /C> >你可能会认为你可能得到<代码>“2005—04-31”这不是一个日期,也不清楚你是否想要“代码>”2005—04-30“或<代码>”2005—05-01。
因此
NA
可能更安全。请注意,将月份添加到7月31日或12月31日不会出现此问题。或者你可以考虑Azhashla删除的帖子并更改括号
mydates  %>% 
   mutate(date2 = rollback(parse_date(date, "%Y-%m-%d") %m+% months(1)))
#          date      date2
# 1  2014-01-31 2014-01-31
# 2  2014-02-28 2014-02-28
# 3  2014-03-31 2014-03-31
# 4  2014-04-30 2014-04-30
# 5  2014-05-30 2014-05-31
# 6  2014-06-30 2014-06-30
# 7  2014-07-31 2014-07-31
# 8  2014-08-29 2014-08-31
# 9  2014-09-30 2014-09-30
# 10 2014-10-31 2014-10-31

help('%m+%')