2014-04-17 60 views
2

我有一個包含項目名稱,開始年份和合同期限的數據集。我需要將這個數據集開發成時間序列。例如,我的數據集中的一行是:項目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

這兩個步驟:

步驟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 

第二步利用了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 
+0

如果連續的'Project.Name'對'Contract.Term'具有相同的值,會不會中斷?我想我們可以在'Project.Name'上使用分組來安全起見。 – Aramis7d

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