我正在做一项针对特定事件的迁移研究。为了创建数据集,我基本上将一个较大的数据集子集到一个特定的日期,然后根据其他日期制作标志,然后添加信息。总共需要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))