【问题标题】:creating sequence of dates for each group in r为 r 中的每个组创建日期序列
【发布时间】:2015-10-30 15:31:04
【问题描述】:

我有一个如下所示的数据集:

      ID    created_at
MUM-0001    2014-04-16
MUM-0002    2014-01-14
MUM-0003    2014-04-17
MUM-0004    2014-04-12
MUM-0005    2014-04-18
MUM-0006    2014-04-17

我正在尝试引入新列,该列将是开始日期和定义的最后一天之间的所有日期(例如,2015 年 7 月 12 日)。我在dplyr 中使用了 seq 函数,但出现错误。

data1 <- data1 %>%
         arrange(ID) %>%
         group_by(ID) %>%
         mutate(date = seq(as.Date(created_at), as.Date('2015-07-12'), by= 1))

我得到的错误是:

错误:大小不兼容 (453),需要 1(组大小)或 1

您能否建议一些更好的方法来在 R 中执行此任务?

【问题讨论】:

    标签: r date dplyr seq


    【解决方案1】:

    您可以使用data.table 获取从“created_at”到“2015-07-12”的日期的sequence,按“ID”列分组。

     library(data.table)
     setDT(df1)[, list(date=seq(created_at, as.Date('2015-07-12'), by='1 day')) , ID]
    

    如果您需要dplyr 的选项,请使用do

     library(dplyr)
     df1 %>% 
       group_by(ID) %>% 
       do( data.frame(., Date= seq(.$created_at,
                                as.Date('2015-07-12'), by = '1 day')))
    

    如果您有重复的 ID,那么我们可能需要按 row_number() 分组

    df1 %>%
        group_by(rn=row_number()) %>%
         do(data.frame(ID= .$ID, Date= seq(.$created_at,
              as.Date('2015-07-12'), by = '1 day'), stringsAsFactors=FALSE))
    

    更新

    根据@Frank 的评论,tidyverse 的新成语是

    library(tidyverse)
    df1 %>%
      group_by(ID) %>% 
      mutate(d = list(seq(created_at, as.Date('2015-07-12'), by='1 day')), created_at = NULL) %>%
      unnest()
    

    data.table的情况

    setDT(df1)[, list(date=seq(created_at, 
                 as.Date('2015-07-12'), by = '1 day')), by = 1:nrow(df1)] 
    

    数据

    df1 <- structure(list(ID = c("MUM-0001", "MUM-0002", "MUM-0003",
     "MUM-0004", 
     "MUM-0005", "MUM-0006"), created_at = structure(c(16176, 16084, 
    16177, 16172, 16178, 16177), class = "Date")), .Names = c("ID", 
    "created_at"), row.names = c(NA, -6L), class = "data.frame")
    

    【讨论】:

    • 我使用了您共享的相同代码:data1 &lt;- data1 %&gt;% group_by(NEW_FORM_ID) %&gt;% do( data.frame(., Date= seq(.$created_at, as.Date('2015-07-12'), by = '1 day'))),但出现错误:Error in seq.Date(.$created_at, as.Date("2015-07-12"), by = "1 day") : 'from' must be of length 1
    • @DheerajSingh 我以您显示的数据为例。更新了 dput 输出。它没有给我错误。您是否有重复的“ID”?
    • ID 中几乎没有重复项。现在它正在工作。谢谢阿克伦。
    • 我只是将其用作欺骗目标。 tidyversers 告诉我,新的成语是创建一个列表 col 并取消嵌套,可能像 df1 %&gt;% group_by(ID) %&gt;% mutate(d = list(seq(created_at, as.Date('2015-07-12'), by='1 day')), created_at = NULL) %&gt;% unnest()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-13
    • 2012-06-08
    • 2019-08-14
    • 2015-08-19
    • 2021-01-26
    • 1970-01-01
    相关资源
    最近更新 更多