按日期范围创建数据框子集列表

Create list of dataframes subset by date range

我正在尝试创建一系列数据帧,这些数据帧是按日期范围(2 年块)从更大数据帧中提取的子集,以便对每个新数据帧进行单独的生存分析。我不能使用“拆分”根据一个因素拆分数据帧,因为数据需要出现在多个子集中。

我有一些示例数据如下:

Patient <- c(1:10)
First.Appt <- c("2014-01-01","2014-03-02","2015-05-17","2015-06-03","2016-01-12","2016-11-07","2017-07-08","2017-09-09","2018-04-12","2018-05-13")
DOD <- c("2014-01-29","2014-03-30","2015-06-14","2015-07-01","2016-02-09","2016-12-05","2017-08-05","2017-10-07","2018-05-10","2018-06-10")
First.Appt.Year <- c(2014,2014,2015,2015,2016,2016,2017,2017,2018,2018)

df <- as.data.frame(cbind(Patient, First.Appt, DOD, First.Appt.Year))%>%
  mutate_at("First.Appt.Year", as.numeric)

我创建了一个开始日期(最小 First.Appt.Year)、最终开始日期(最大 First.Appt.Year - 1),然后是一个包含我所有开始日期的向量,从中可以提取完整的子集2 年区块如下:

Start.year <- as.numeric(min(df$First.Appt.Year))

Final.start.year <- max(df$First.Appt.Year) - 1

Start.vec <- c(Start.year:Final.start.year)

我想使用带有 lapply 的 for 循环来基于落在 Start.vec 和 Start.vec + 1 范围内的 First.Appt.Year 创建一个子集,对于每个Start.vec 的值如下:

for (i in 1:length(Start.vec)){
new.df = lapply(Start.vec, function(x) 
subset(df, First.Appt.Year == Start.vec[i] | First.Appt.Year == Start.vec[i] + 1))
}

几乎有效,但不是创建四个不同的数据帧(例如 2014-2015、2015-2016、2016-2017 和 2017-2018),所有四个数据帧在输出列表中仅包含 2017-2018 值,如下所示。

Patient First.Appt DOD First.Appt.Year
7 08/07/2017 05/08/2017 2017
8 09/09/2017 07/10/2017 2017
9 12/04/2018 10/05/2018 2018
10 13/05/2018 10/06/2018 2018

任何人都可以帮助我解决我做错了什么以及如何将不同的子集 return 到每个列表对象中吗?

如果还有其他看起来更合乎逻辑的方法,请告诉我。

你很接近!无需同时使用 for 循环和 lapply,您只需要一个。

例如,lapply:

new.df <- lapply(Start.vec, function(x) subset(df, First.Appt.Year == x | First.Appt.Year == x + 1))

并且仅使用 for 循环:

df_list <- list()

for (i in 1:length(Start.vec)){
  new.df <- subset(df, First.Appt.Year == Start.vec[i] | First.Appt.Year == Start.vec[i] + 1)
  
  df_list <- c(df_list, list(new.df))
}

df_list

看来只是对lapply的使用产生了简单的误解。您不需要将其包装在 for 循环中。只需将最后一个块替换为 :

new.df = lapply(Start.vec, function(x) subset(df, First.Appt.Year == x | First.Appt.Year == x + 1))

这应该行得通。至少,对我来说是这样。