将基于日期的分析更改一年:过程问题



我正在做一项针对特定事件的迁移研究。为了创建数据集,我基本上将一个较大的数据集子集到一个特定的日期,然后根据其他日期制作标志,然后添加信息。总共需要7个脚本。现在,我想创建一个比较数据集,使用相同的信息,但索引到两年前。

我的问题是,有没有一种简单的方法,我可以使用相同的脚本,只告诉R以某种方式将所有代码视为两年前的代码,或者我必须创建代码的副本,然后按行编辑为两年前。下面是一个非常基本的例子,我正在使用一些代码从一个更大的框架生成数据集:

#example of things I'd want shifted 2 years     
df <- subset(df, DATE_AFTER > as.Date("2016-09-27"))
df$flag <- with(df, 
as.numeric(DATE_BEFORE < as.Date("2016-09-28") & 
DATE_AFTER > as.Date("2016-09-27")))
df
#   ID DATE_BEFORE DATE_AFTER flag
# 1  A  2013-01-23 2018-01-23    1
# 3  C  2018-01-23 2020-01-23    0
# 5  E  2011-01-23 2019-01-23    1
# 6  F  2010-01-23 2019-01-23    1
# 7  G  2017-01-23 2018-01-23    0

伪数据

df <- data.frame(ID=c("A", "B", "C", "D", "E", "F", "G"),
DATE_BEFORE=as.Date(c("2013-01-23", "2010-01-23", "2018-01-23",
"2014-01-23", "2011-01-23", "2010-01-23", 
"2017-01-23")),
DATE_AFTER=as.Date(c("2018-01-23", "2016-01-23", "2020-01-23", 
"2016-01-23", "2019-01-23", "2019-01-23", 
"2018-01-23")))

只需将其包装在一个函数中。要减去年份,我们可以使用as.POSIXlt,如这个答案所示。

my_df_subset <- (date, subtract_yr=0L) {
dt <- as.POSIXlt(paste0(date, '-01'))
dt$year <- dt$year - subtract_yr
dt <- as.Date(dt)
transform(subset(df, DATE_AFTER > dt),
flag=as.numeric(DATE_BEFORE < dt + 1L & 
DATE_AFTER > dt))
}
my_df_subset("2016-09-27")
#   ID DATE_BEFORE DATE_AFTER flag
# 1  A  2013-01-23 2018-01-23    1
# 3  C  2018-01-23 2020-01-23    0
# 5  E  2011-01-23 2019-01-23    1
# 6  F  2010-01-23 2019-01-23    1
# 7  G  2017-01-23 2018-01-23    0
my_df_subset("2016-09-27", 2L)  ## two years earlier
#   ID DATE_BEFORE DATE_AFTER flag
# 1  A  2013-01-23 2018-01-23    1
# 2  B  2010-01-23 2016-01-23    1
# 3  C  2018-01-23 2020-01-23    0
# 4  D  2014-01-23 2016-01-23    1
# 5  E  2011-01-23 2019-01-23    1
# 6  F  2010-01-23 2019-01-23    1
# 7  G  2017-01-23 2018-01-23    0

注意:R>=4.1使用。


数据:

df <- structure(list(ID = c("A", "B", "C", "D", "E", "F", "G"), DATE_BEFORE = structure(c(15728, 
14632, 17554, 16093, 14997, 14632, 17189), class = "Date"), DATE_AFTER = structure(c(17554, 
16823, 18284, 16823, 17919, 17919, 17554), class = "Date")), class = "data.frame", row.names = c(NA, 
-7L))

最新更新