【问题标题】:Create list of dataframes subset by date range按日期范围创建数据框子集列表
【发布时间】:2021-10-26 12:44:02
【问题描述】:

我正在尝试创建一系列数据帧,这些数据帧是按日期范围(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 循环来创建一个基于 First.Appt.Year 的子集,该子集在 Start.vec 和 Start.vec + 1 的范围内,对于 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

谁能帮我解决我做错了什么以及如何将不同的子集返回到每个列表对象中?

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

【问题讨论】:

    标签: r for-loop subset lapply


    【解决方案1】:

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

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

    这应该可行。至少,它对我有利。

    【讨论】:

    • 非常感谢!太完美了:)
    【解决方案2】:

    你已经接近了!不要同时使用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
    

    【讨论】:

    • 我的话,太棒了!谢谢 :) 只是等待能够接受这是正确的(抱歉,第二次发帖)
    猜你喜欢
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多