【问题标题】:Expanding rows to include interim years in a date range扩展行以包括日期范围中的过渡年份
【发布时间】:2019-04-30 16:55:20
【问题描述】:

我有一个包含日期范围的数据框,我想从中创建新的行来表示该范围所包含的每一年(包括开始和结束年份)。它看起来像这样:

id      start      end  
1      2000         2004  
2      2005         2005  
3      2005         2007  
4      2001         2002 

其中 'id' 是一个因素,'start' 和 'end' 是日期。

但我需要将数据框扩展为如下所示:

id      year        
1       2000 
1       2001
1       2002
1       2003 
1       2004
2       2005
3       2005
3       2006
3       2007
4       2001
4       2002

我已经尝试过这里建议的方法:Expand rows by date range using start and end date 和这里Generate rows between two dates in a dataframe。具体我跑了:

library(data.table)
setDT(df)[, .(year = seq.Date(start, end, by = '1 year')), by = 'id']

并且还尝试了 dplyr 方法:

library(dplyr)
library(purrr)
df_expanded <- df %>%
  transmute(id, year = map2(start, end, seq, by = "year")) %>%
  unnest %>% 
  distinct

两次尝试都导致了类似的错误:

Error in seq.int(r1$year, to0$year, by) : wrong sign in 'by' argument

我已经查看了,但我无法弄清楚为什么会出现此错误。我应该提到这个错误也发生在格式为 YYYY-MM-DD 的完整日期中。我对每月或每天的差异不感兴趣,因此我将它们重新格式化为仅 YYYY,但此代码仍在返回错误消息。

有人可以帮忙吗?

【问题讨论】:

    标签: r date dplyr data.table


    【解决方案1】:

    样本数据

    library(data.table)
    DT <- fread("id      start      end  
    1      2000         2004  
    2      2005         2005  
    3      2005         2007  
    4      2001         2002")
    

    代码

    year 是数字(而不是日期),因此您可以通过id 创建一个从startend 的向量。

    DT[, .(year = start:end), by = .(id)][]
    

    输出

    #     id year
    #  1:  1 2000
    #  2:  1 2001
    #  3:  1 2002
    #  4:  1 2003
    #  5:  1 2004
    #  6:  2 2005
    #  7:  3 2005
    #  8:  3 2006
    #  9:  3 2007
    # 10:  4 2001
    # 11:  4 2002
    

    【讨论】:

    • 这非常有效。非常感谢 - 显然我需要阅读 data.table
    猜你喜欢
    • 2021-11-01
    • 1970-01-01
    • 2016-10-14
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    相关资源
    最近更新 更多