【问题标题】:How to open new rows based on 2 date columns in r如何根据 r 中的 2 个日期列打开新行
【发布时间】:2020-09-08 21:48:57
【问题描述】:

我有以下大型数据集的示例数据集 -

     isin       directorid dob_Year2 ROLE_START ROLE_END gender datestartrole dateendrole
 US6819771048     340769      1970       1995     2003      M    1995-02-01  2003-01-09
 US6819771048     340769      1970       2003     2004      M    2003-01-09  2004-02-24
 US6819771048     340769      1970       2004     2007      M    2004-02-24  2007-09-07
 US68243Q1067      86917      1951       1986     2016      M    1986-01-01  2016-06-30
 US68243Q1067      86917      1951       1976     1986      M    1976-04-01  1986-01-01
 US68243Q1067     327069      1961       2016     2020      M    2016-06-30  2020-05-21

我的问题是 - 我想根据变量ROLE_STARTROLE_END 创建新行。的数量 要创建的行取决于 MINIMUM ROLE_STARTMAXIMUM ROLE_END 假设数据按 isindirectorid 分组。例如 - 对于isin US6819771048 和 directorid 340769,MINIMUM ROLE_START 年份是 1995 年,MAXIMUM ROLE_END 年份是 2007 年。所以我需要打开1995-2007 和这些年份的每一年的行应存储在 YEAR 变量中。 请注意,在上面的示例中,1995-2007 之间没有中断,因为从 ROLE_STARTROLE_END 可以清楚地看出所有年份都包括在内。如果任何年份之间有任何中断,则应排除这些中断。对于上面的示例数据集,我预期的数据集应该是这样的 -

     isin       directorid dob_Year2 ROLE_START ROLE_END gender datestartrole dateendrole YEAR
US6819771048     340769      1970       1995     2003      M    1995-02-01  2003-01-09   1995
US6819771048     340769      1970       1995     2003      M    1995-02-01  2003-01-09   1996
US6819771048     340769      1970       1995     2003      M    1995-02-01  2003-01-09   1997
US6819771048     340769      1970       1995     2003      M    1995-02-01  2003-01-09   1998
US6819771048     340769      1970       1995     2003      M    1995-02-01  2003-01-09   1999
US6819771048     340769      1970       1995     2003      M    1995-02-01  2003-01-09   2000
US6819771048     340769      1970       1995     2003      M    1995-02-01  2003-01-09   2001
US6819771048     340769      1970       1995     2003      M    1995-02-01  2003-01-09   2002
US6819771048     340769      1970       1995     2003      M    1995-02-01  2003-01-09   2003
US6819771048     340769      1970       2003     2004      M    2003-01-09  2004-02-24   2003
US6819771048     340769      1970       2003     2004      M    2003-01-09  2004-02-24   2004
US6819771048     340769      1970       2004     2007      M    2004-02-24  2007-09-07   2004
US6819771048     340769      1970       2004     2007      M    2004-02-24  2007-09-07   2005
US6819771048     340769      1970       2004     2007      M    2004-02-24  2007-09-07   2006
US6819771048     340769      1970       2004     2007      M    2004-02-24  2007-09-07   2007
US68243Q1067      86917      1951       1986     2016      M    1986-01-01  2016-06-30   1986
US68243Q1067      86917      1951       1986     2016      M    1986-01-01  2016-06-30   1987
US68243Q1067      86917      1951       1986     2016      M    1986-01-01  2016-06-30   1988
US68243Q1067      86917      1951       1986     2016      M    1986-01-01  2016-06-30   1989
US68243Q1067      86917      1951       1986     2016      M    1986-01-01  2016-06-30   1990
US68243Q1067      86917      1951       1986     2016      M    1986-01-01  2016-06-30   1991
US68243Q1067      86917      1951       1986     2016      M    1986-01-01  2016-06-30   1992
US68243Q1067      86917      1951       1986     2016      M    1986-01-01  2016-06-30   1993
US68243Q1067      86917      1951       1986     2016      M    1986-01-01  2016-06-30   1994
US68243Q1067      86917      1951       1986     2016      M    1986-01-01  2016-06-30   1995
US68243Q1067      86917      1951       1986     2016      M    1986-01-01  2016-06-30   1996
US68243Q1067      86917      1951       1986     2016      M    1986-01-01  2016-06-30   1997
US68243Q1067      86917      1951       1986     2016      M    1986-01-01  2016-06-30   1998
US68243Q1067      86917      1951       1986     2016      M    1986-01-01  2016-06-30   1999
US68243Q1067      86917      1951       1986     2016      M    1986-01-01  2016-06-30   2000
US68243Q1067      86917      1951       1986     2016      M    1986-01-01  2016-06-30   2001
US68243Q1067      86917      1951       1986     2016      M    1986-01-01  2016-06-30   2002
US68243Q1067      86917      1951       1986     2016      M    1986-01-01  2016-06-30   2003
US68243Q1067      86917      1951       1986     2016      M    1986-01-01  2016-06-30   2004
US68243Q1067      86917      1951       1986     2016      M    1986-01-01  2016-06-30   2005
US68243Q1067      86917      1951       1986     2016      M    1986-01-01  2016-06-30   2006
US68243Q1067      86917      1951       1986     2016      M    1986-01-01  2016-06-30   2007
US68243Q1067      86917      1951       1986     2016      M    1986-01-01  2016-06-30   2008
US68243Q1067      86917      1951       1986     2016      M    1986-01-01  2016-06-30   2009
US68243Q1067      86917      1951       1986     2016      M    1986-01-01  2016-06-30   2010
US68243Q1067      86917      1951       1986     2016      M    1986-01-01  2016-06-30   2011
US68243Q1067      86917      1951       1986     2016      M    1986-01-01  2016-06-30   2012
US68243Q1067      86917      1951       1986     2016      M    1986-01-01  2016-06-30   2013
US68243Q1067      86917      1951       1986     2016      M    1986-01-01  2016-06-30   2014
US68243Q1067      86917      1951       1986     2016      M    1986-01-01  2016-06-30   2015
US68243Q1067      86917      1951       1986     2016      M    1986-01-01  2016-06-30   2016
US68243Q1067      86917      1951       1976     1986      M    1976-04-01  1986-01-01   1976
US68243Q1067      86917      1951       1976     1986      M    1976-04-01  1986-01-01   1977
US68243Q1067      86917      1951       1976     1986      M    1976-04-01  1986-01-01   1978
US68243Q1067      86917      1951       1976     1986      M    1976-04-01  1986-01-01   1979
US68243Q1067      86917      1951       1976     1986      M    1976-04-01  1986-01-01   1980
US68243Q1067      86917      1951       1976     1986      M    1976-04-01  1986-01-01   1981
US68243Q1067      86917      1951       1976     1986      M    1976-04-01  1986-01-01   1982
US68243Q1067      86917      1951       1976     1986      M    1976-04-01  1986-01-01   1983
US68243Q1067      86917      1951       1976     1986      M    1976-04-01  1986-01-01   1984
US68243Q1067      86917      1951       1976     1986      M    1976-04-01  1986-01-01   1985
US68243Q1067      86917      1951       1976     1986      M    1976-04-01  1986-01-01   1986
US68243Q1067     327069      1961       2016     2020      M    2016-06-30  2020-05-21   2016
US68243Q1067     327069      1961       2016     2020      M    2016-06-30  2020-05-21   2017
US68243Q1067     327069      1961       2016     2020      M    2016-06-30  2020-05-21   2018
US68243Q1067     327069      1961       2016     2020      M    2016-06-30  2020-05-21   2019
US68243Q1067     327069      1961       2016     2020      M    2016-06-30  2020-05-21   2020

【问题讨论】:

    标签: r dplyr data.table tidyverse lubridate


    【解决方案1】:

    您可以在ROLE_STARTROLE_END 之间创建一个序列并获取不同行中的数据。

    library(dplyr)
    df %>%
      mutate(YEAR = purrr::map2(ROLE_START, ROLE_END, seq)) %>%
      tidyr::unnest(YEAR)
    
    
    #   isin         directorid dob_Year2 ROLE_START ROLE_END gender datestartrole dateendrole  YEAR
    #   <chr>             <int>     <int>      <int>    <int> <chr>  <chr>         <chr>       <int>
    # 1 US6819771048     340769      1970       1995     2003 M      1995-02-01    2003-01-09   1995
    # 2 US6819771048     340769      1970       1995     2003 M      1995-02-01    2003-01-09   1996
    # 3 US6819771048     340769      1970       1995     2003 M      1995-02-01    2003-01-09   1997
    # 4 US6819771048     340769      1970       1995     2003 M      1995-02-01    2003-01-09   1998
    # 5 US6819771048     340769      1970       1995     2003 M      1995-02-01    2003-01-09   1999
    # 6 US6819771048     340769      1970       1995     2003 M      1995-02-01    2003-01-09   2000
    # 7 US6819771048     340769      1970       1995     2003 M      1995-02-01    2003-01-09   2001
    # 8 US6819771048     340769      1970       1995     2003 M      1995-02-01    2003-01-09   2002
    # 9 US6819771048     340769      1970       1995     2003 M      1995-02-01    2003-01-09   2003
    #10 US6819771048     340769      1970       2003     2004 M      2003-01-09    2004-02-24   2003
    # … with 52 more rows
    

    【讨论】:

    • 嗨,@Ronak Shah- 当我在更大的数据集中应用上述代码时收到错误消息。错误信息是——Error in seq.default(.x[[1L]], .y[[1L]], ...) : 'from' must be a finite number 另一个问题——我想我应该在使用上面的代码之前使用group_by(isin, directorid)
    • 我认为不需要group_by,因为如果我理解正确,您想根据ROLE_STARTROLE_END 扩展行,而不管它们属于哪个组。就错误消息而言,您在数据中是否有NA 值?如果是,你想为它做什么?
    • 嗨,@Ronak Shah- 我有NA 我相信。如果他们被拿出来我没问题。谢谢。
    • 嗨,@Ronak Shah- 如果我取出 NA,它现在可以工作了。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-05
    相关资源
    最近更新 更多