2017-09-28 71 views
0

我有一個數據幀,看起來像這個附加列個月:如何在數據幀在特定位置

CONTRACT_ID START_DATE SERVICE VALUE year month 
1   01-01-2018 A  10  2018  1 
2   01-01-2018 B  20  2018  1 
3   01-01-2018 C  30  2018  1 
4   01-03-2018 B  40  2018  3 
5   01-03-2018 C  50  2018  3 
6   01-03-2018 A  60  2018  3 

而且我已經轉化爲一種形式是這樣的:

CONTRACT_ID year SERVICE 1 3 
1   2018 A 10 NA 
2   2018 B 20 NA 
3   2018 C 30 NA 
4   2018 B NA 40 
5   2018 C NA 50 
6   2018 A NA 60 

使用重塑功能是這樣的:

reshape(df, idvar = c("year","CONTRACT_ID","SERVICE"), timevar = "month", direction = "wide") 

的問題是,在我目前的數據幀,我沒有數據,某些月份的就像我們在這裏看到的2(feb)。但我想補充列所有缺少像幾個月:

CONTRACT_ID year SERVICE 1 2 3 
1   2018 A 10 NA NA 
2   2018 B 20 NA NA 
3   2018 C 30 NA NA 
4   2018 B NA NA 40 
5   2018 C NA NA 50 
6   2018 A NA NA 60 

如何實現這一目標。我知道我可以在最後添加列,但效果不明顯。我正在創建一個腳本,並希望它效率更高,耗時更少。

編輯: 根據以下評論的建議,我使用spread函數來擴大數據。 但是,如果我保留drop = False該代碼將所有組合作爲輸出顯着增加表大小。如果我將它設置爲TRUE,它不會創建組合,但它也會刪除當前數據中沒有數據的月份列。我想保留列,但不包含CONTRACT_ID,DATE,SERVICE不存在的組合。最初我在隨後的步驟中刪除了這些行,但現在表的大小已經大大增加了,我需要在進行數據傳播的同時處理它。 任何建議。

+0

我是否需要添加一個新的問題,因爲我一直在試圖找到一個解決這個問題的方法,並失敗了..現在我的想法已經不多了。 –

回答

0

試試這個。

library(tidyr) 
long_data <- read.table(header=TRUE, text=' 
CONTRACT_ID START_DATE SERVICE VALUE year month 
1   01-01-2018 A  10  2018  1 
          2   01-01-2018 B  20  2018  1 
          3   01-01-2018 C  30  2018  1 
          4   01-03-2018 B  40  2018  3 
          5   01-03-2018 C  50  2018  3 
          6   01-03-2018 A  60  2018  3 
          ') 
long_data 
long_data$month <- factor(long_data$month, levels = 1:12, ordered = TRUE) 
spread(long_data, key = month, value = VALUE, fill = NA, drop = FALSE) 
+0

謝謝,按預期工作! –

+0

我還有一個問題:如果我保留'drop = False',代碼會將所有組合作爲輸出,這會顯着增加表的大小。如果我將它設爲TRUE,它不會創建組合,但它也會刪除我沒有數據的月份列。我想保留列,但不包含CONTRACT_ID,DATE,SERVICE不存在的組合。最初我在隨後的步驟中刪除了這些行,但現在表的大小已經大大增加了,我需要在進行數據傳播的同時處理它。有什麼建議麼。 –