【问题标题】:repeat rows in a dataset based on a column, but increment the rows [duplicate]基于列重复数据集中的行,但增加行[重复]
【发布时间】:2014-06-02 00:55:59
【问题描述】:

我有一个包含项目名称、开始年份和合同期限的数据集。我需要将此数据集开发成时间序列。例如,我的数据集中的一行是:项目 A,从 2003 年开始,合同期限为 5。我想根据合同期限重复每一行。我的数据集如下所示:

Project Name    Start Year    Contract Term
A                 2003            5
B                 2013            3
C                 2000            2

我想要的结果应该是这样的:

Project Name    Start Year    Contract Term
A                 2003            5
A                 2004            5
A                 2005            5
A                 2006            5
A                 2007            5

B                 2013            3
B                 2014            3
B                 2014            3

C                 2000            2
C                 2001            2

我试过了:

rpsData <- rpsInput[rep(rownames(rpsInput), rpsInput$Contract.Term), ]

但这只会按照合同期限内的数量重复每个项目。我不能让它增加岁月。

提前致谢!

【问题讨论】:

    标签: r dataframe rep


    【解决方案1】:

    这里分两步:

    第一步,你懂的:

    rpsData <- rpsInput[rep(rownames(rpsInput), rpsInput$Contract.Term), ]
    rpsData
    #     Project.Name Start.Year Contract.Term
    # 1              A       2003             5
    # 1.1            A       2003             5
    # 1.2            A       2003             5
    # 1.3            A       2003             5
    # 1.4            A       2003             5
    # 2              B       2013             3
    # 2.1            B       2013             3
    # 2.2            B       2013             3
    # 3              C       2000             2
    # 3.1            C       2000             2
    

    第2步使用sequence和基本加法:

    sequence(rpsInput$Contract.Term) ## This will be helpful...
    #  [1] 1 2 3 4 5 1 2 3 1 2
    
    rpsData$Start.Year <- rpsData$Start.Year + sequence(rpsInput$Contract.Term)
    rpsData
    #     Project.Name Start.Year Contract.Term
    # 1              A       2004             5
    # 1.1            A       2005             5
    # 1.2            A       2006             5
    # 1.3            A       2007             5
    # 1.4            A       2008             5
    # 2              B       2014             3
    # 2.1            B       2015             3
    # 2.2            B       2016             3
    # 3              C       2001             2
    # 3.1            C       2002             2
    

    【讨论】:

    • 如果连续的Project.NameContract.Term 具有相同的值,这不会中断吗?我想为了安全起见,我们可以使用Project.Name 上的分组。
    【解决方案2】:

    只是为了捎带阿难的答案,改变

    sequence(rpsInput$Contract.Term)
    

    (sequence(rpsInput$Contract.Term)-1)
    

    得到你想要的输出。

    ProjectName<-c("A","B","C")
    Start.Year<-c(2003,2013,2000)
    Contract.Term<-c(5,3,2)
    rpsInput<-data.frame(ProjectName,Start.Year,Contract.Term)
    rpsData <- rpsInput[rep(rownames(rpsInput), rpsInput$Contract.Term), ]
    rpsData$Start.Year <- rpsData$Start.Year + (sequence(rpsInput$Contract.Term)-1)
    rpsData
    #    ProjectName Start.Year Contract.Term
    #1             A       2003             5
    #1.1           A       2004             5
    #1.2           A       2005             5
    #1.3           A       2006             5
    #1.4           A       2007             5
    #2             B       2013             3
    #2.1           B       2014             3
    #2.2           B       2015             3
    #3             C       2000             2
    #3.1           C       2001             2
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-30
      • 2018-05-08
      • 2018-04-28
      • 1970-01-01
      • 1970-01-01
      • 2021-04-28
      相关资源
      最近更新 更多