【问题标题】:R: expand and fill data frame by date in seriesR:按日期顺序扩展和填充数据框
【发布时间】:2019-01-25 23:26:05
【问题描述】:

我有原始数据框:

igroup=c("A", "B", "C")
demo_df=data.frame(date=c("2018-11-28", "2018-12-17", "2019-01-23"), group)

原始数据框:

      date   group
1 2018-11-28     A
2 2018-12-17     B
3 2019-01-23     C

我想要一个将日期扩展到下一列但仍保留组信息的数据框。例如,从 2018-11-28 到 2018-12-16 的日期属于 A 组,从 2018-12-17 到 2019-01-22 的日期属于 B 组,而 2019-01-23 属于 C 组。

这是我想要的输出 (result_df):

time=c(seq(as.Date("2018-11-28"), as.Date("2018-12-17")-1, by=1), 
seq(as.Date("2018-12-17"), as.Date("2019-01-23")-1, by=1),as.Date("2019-01-23") )
group1=c(rep("A",as.numeric(as.Date("2018-12-17")-as.Date("2018-11-28"))), 
rep("B",as.numeric(as.Date("2019-01-23")-as.Date("2018-12-17"))), "C" )
result_df=data.frame(time,group1 )
result_df

我想知道是否有更有效的方法(使用dplyr)来处理这个问题。

提前致谢。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    首先,确保date 存储为日期对象:

    demo_df$date <- as.Date(demo_df$date, format = "%Y-%m-%d")
    

    然后使用tidyverse,我们先complete这个序列,然后fill这个group down:

    library(tidyverse)
    
    demo_df %>% complete(date = seq.Date(min(date), max(date), by = "day")) %>% 
     fill(igroup)
    

    【讨论】:

    • 哇!所以tidyverse是关键!非常感谢!我很感激!我应该从今天开始练习tidyverse...
    • @Joanna 和很多事情一样,有不止一种方法可以做到这一点,但tidyverse 在许多情况下提供了一个不错、紧凑、可读的解决方案,包括这个。
    • 感谢分享。 dplyrtidyverse 有什么区别?我只知道他们很受欢迎......
    • @Joanna dplyr 实际上是tidyverse 的一部分。 tidyverse 代表一组设计用于在 R 中处理数据的包。就它们的使用方式而言,它们都具有相似的逻辑框架,并且它们共同提供了一组强大的工具来处理各种问题和数据集.更多信息:tidyverse.org
    • 明白了!感谢分享!我真的很感激!
    【解决方案2】:

    多年后经历,​​这是Mako212's answer的变体:

    demo_df %>% complete(date=full_seq(date,1)) %>% fill(group)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-23
      • 1970-01-01
      • 2019-05-02
      • 2017-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多