基于列重复数据集中的行,但增加行

时间:2014-04-17 16:19:51

标签: r dataframe rep

我有一个包含项目名称,开始年份和合同期限的数据集。我需要将这个数据集开发成时间序列。例如,我的数据集中的一行是:项目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), ]

但这仅以合同期限中的数字重复每个项目。我不能让它增加岁月。

提前致谢!

2 个答案:

答案 0 :(得分:2)

这是分两步:

第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

答案 1 :(得分:1)

只是为了回顾Ananda的回答,改变

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