按日期范围创建数据框子集列表
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))
这应该行得通。至少,对我来说是这样。
我正在尝试创建一系列数据帧,这些数据帧是按日期范围(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))
这应该行得通。至少,对我来说是这样。