【问题标题】:Fill dataframe dates by variable in R通过R中的变量填充数据框日期
【发布时间】:2020-05-21 15:12:21
【问题描述】:

我有一个包含 10 家医院的虚拟数据集,其中记录了该医院在特定日期有多少工作。这些日期是每周进行的,缺少日期意味着该周有 0 个工作。

set.seed(2020)

df1 <- data.frame(
Date = as.Date(sample( as.numeric(as.Date('2011-01-01')): as.numeric(as.Date('2013-04-14')), 10, replace = T), origin = '1970-01-01'),
Hospital = sample(1:10,replace=T),
Jobs = rpois(10,2))

我想填写每家医院的缺失日期(每周拍摄),因此每家医院有 120 个条目(因为 2011-01-01 和 2013-04-14 之间有 120 周),其中为新日期分配了 0 的“工作”变量。因此输出一个包含 1200 行的数据框(10 家医院,每个医院有 120 周的条目)。

注意:我尝试了一个解决方案:R fill missing dates by category,但它只填充数据中已经存在的最小值和最大值之间的缺失日期,而不是上面定义的日期。我还尝试将开始和结束日期手动添加到每个医院的数据中,应用解决方案,然后再次删除它们,但这不能按预期工作。

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    你一周的约会总是在同一个工作日吗?您的示例数据随机绘制工作日。我有一个可行的解决方案,但前提是日期的工作日始终相同。如果不是这种情况,您将不得不做更多的工作来清理您的输入数据。

    生成在同一工作日获取的测试数据:

    set.seed(2020)
    
    df1 <- data.frame(
      Date = as.Date(sample(c(as.numeric(as.Date('2011-01-01')),
                              as.numeric(as.Date('2011-12-17')),
                              as.numeric(as.Date('2012-04-21')),
                              as.numeric(as.Date('2012-09-15')),
                              as.numeric(as.Date('2011-04-16')),
                              as.numeric(as.Date('2013-04-14'))), 10, replace = T),
                     origin = '1970-01-01'),
      Hospital = sample(1:10,replace=T),
      Jobs = rpois(10,2))
    

    然后,为所有医院生成一个包含所有所需日期(从 2011-01-01 开始)的 data.frame:

    date_df <- data.frame(Date = rep(seq(as.Date("2011/01/01"), by = "week",
                                     length.out = 120),
                                     times = 10),
                          Hospital = rep(1:10, each = 120))
    

    现在,您可以连接两个 data.frame,right_join 返回第二个 data.frame 中的所有行,因此您可以涵盖所有日期。然后,将NAs 替换为 0:

    library(dplyr)
    df_join <- right_join(df1, date_df) %>% 
      mutate(Jobs = ifelse(is.na(Jobs), 0, Jobs))
    

    【讨论】:

    • 比我用的方法效率高多了,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    • 2018-01-31
    • 2015-11-16
    • 1970-01-01
    • 1970-01-01
    • 2021-10-03
    相关资源
    最近更新 更多