将数据集r中变量的值上移一个月



我的数据集中有一个变量x(2018年1月- 2021年6月):

date       | specific_date | x
2018-01-31 | 2019-10-31    | 0
...
2019-08-31 | 2019-10-31    | 0
2019-09-30 | 2019-10-31    | 0
2019-10-31 | 2019-10-31    | 1
2019-11-30 | 2019-10-31    | NA
2019-12-31 | 2019-10-31    | NA
...
2021-06-30 | 2019-10-31    | NA

我想把x中的所有内容都向上移动一个月,就像这样(1从date=2019-10-31到date=2019-09-30,以此类推):

date       | specific_date | variable
2018-01-31 | 2019-10-31    | 0
...
2019-08-31 | 2019-10-31    | 0
2019-09-30 | 2019-10-31    | 1
2019-10-31 | 2019-10-31    | NA
2019-11-30 | 2019-10-31    | NA
2019-12-31 | 2019-10-31    | NA
...
2021-06-30 | 2019-10-31    | NA

有什么好主意吗?

假设输入在最后的注释中以可重复的形式显示,并且假设您想将日期列提前x个月,将其转换为yearmon类,减去x/12(因为yearmon表示每个日期为一年加0表示1月,1/12表示2月,…如果x是NA,则减去0,然后用as。日期转换为日期类。Frac =1表示转换为月底的日期。

另一种可能性是只使用yearmon类而不使用Date类,因为它直接表示没有日期的年份和月份,而显示的月末日期似乎只是表示年份和月份的一种方式。在这种情况下,省略as。日期和它的frac=参数

library(dplyr, exclude = c("lag", "filter"))
library(zoo)    
DF %>%
mutate(date = as.Date(as.yearmon(date) - coalesce(x, 0)/12, frac = 1))

给:

date specific_date  x
1 2018-01-31    2019-10-31  0
2 2019-08-31    2019-10-31  0
3 2019-09-30    2019-10-31  0
4 2019-09-30    2019-10-31  1
5 2019-11-30    2019-10-31 NA
6 2019-12-31    2019-10-31 NA
7 2021-06-30    2019-10-31 NA

注意

以可复制形式的输入数据帧:

Lines <- "    date       | specific_date | x
2018-01-31 | 2019-10-31    | 0
...
2019-08-31 | 2019-10-31    | 0
2019-09-30 | 2019-10-31    | 0
2019-10-31 | 2019-10-31    | 1
2019-11-30 | 2019-10-31    | NA
2019-12-31 | 2019-10-31    | NA
...
2021-06-30 | 2019-10-31    | NA"
DF <- read.table(text = Lines, header = TRUE, sep = "|", strip.white = TRUE,
comment.char = ".")

最新更新