2017-06-16 23 views
1

我想用線性模型來擬合季節性假人的電價。所以「DK.days」包含每年10年的日子。如何創建一個季節性假人

head(DK.days) 
[1] "2007-01-01" "2007-01-02" "2007-01-03" "2007-01-04" "2007-01-05" "2007-01-06" 

這是代碼的其餘部分。

month <- as.numeric(format(DK.days, "%m")) 
MD <- t(sapply(month, "==", c(1:12,0)))+0 
MD <- MD[,-13] 
dimnames(MD) <- list(NULL, c("Jan", "Feb", "Mar", "Apr", "May", "June", "July", "Aug", "Sep", "Oct", "Noe", "Dec")) 
> head(MD) 
     Jan Feb Mar Apr May June July Aug Sep Oct Noe Dec 
[1,] 1 0 0 0 0 0 0 0 0 0 0 0 
[2,] 1 0 0 0 0 0 0 0 0 0 0 0 

因此,我創建了一個每月假人,我想將矩陣轉換爲季節性矩陣。這就是季節應該如何定義:

month.list <- list(c(3,4,5), c(6,7,8), c(9,10,11), c(12,1,2)) 

我想到合併的月份的列,但我一直在努力到目前爲止。如果有人能提供幫助,我會非常感激。

+0

請仔細閱讀[如何使R中一個偉大的可重複的例子?(https://開頭計算器.com/questions/5963269/how-to-make-a-great-r-reproducible-example)所以我可以在你的數據上測試解決方案; – Masoud

回答

1

您可以使用zoo包:

library(zoo) 
yq <- as.yearqtr(as.yearmon(DK.days) + 1/12) #+1/12 to shift one month 
DK.seasons <- factor(format(yq, "%q"), levels = 1:4, 
        labels = c("winter", "spring", "summer", "fall")) 

例子:

#make an example data-set 
DK.days <- c("2016-01-01","2016-02-29","2016-03-02","2016-04-03", 
       "2016-05-04","2016-06-05","2016-07-06","2016-08-10", 
       "2016-09-06","2016-10-06","2016-11-06","2016-12-06") 
library(anytime) 
DK.Days <- anytime(DK.days) 

library(zoo) 
yq <- as.yearqtr(as.yearmon(DK.days) + 1/12) #+1/12 to shift one month 
DK.seasons <- factor(format(yq, "%q"), levels = 1:4, 
       labels = c("winter", "spring", "summer", "fall")) 

DK.final <- data.frame(cbind(DK.days, data.frame(DK.seasons))) 

這將是輸出:

> DK.final 

#  DK.days DK.seasons 
# 1 2016-01-01  winter 
# 2 2016-02-29  winter 
# 3 2016-03-02  spring 
# 4 2016-04-03  spring 
# 5 2016-05-04  spring 
# 6 2016-06-05  summer 
# 7 2016-07-06  summer 
# 8 2016-08-10  summer 
# 9 2016-09-06  fall 
# 10 2016-10-06  fall 
# 11 2016-11-06  fall 
# 12 2016-12-06  winter 

讓虛擬變量:

如果你想作爲每個季節虛擬變量列然後使用mlr包:

library(mlr) 
DK.final <- cbind(DK.final,createDummyFeatures(DK.final[,2], cols = "var")) 

這會給你:

> DK.final 

#  DK.days DK.seasons winter spring summer fall 
# 1 2016-01-01  winter  1  0  0 0 
# 2 2016-02-29  winter  1  0  0 0 
# 3 2016-03-02  spring  0  1  0 0 
# 4 2016-04-03  spring  0  1  0 0 
# 5 2016-05-04  spring  0  1  0 0 
# 6 2016-06-05  summer  0  0  1 0 
# 7 2016-07-06  summer  0  0  1 0 
# 8 2016-08-10  summer  0  0  1 0 
# 9 2016-09-06  fall  0  0  0 1 
# 10 2016-10-06  fall  0  0  0 1 
# 11 2016-11-06  fall  0  0  0 1 
# 12 2016-12-06  winter  1  0  0 0 
+0

嘿,謝謝你的回答,但我需要一個四列的矩陣 - 每個季節一個。矩陣應該包括1和0 - 如果日期屬於季節 - 例如在「01-01-2007」行中,我需要在第一列中列出一個(「冬季」),而其他三列中則爲零。如果您需要有關數據集的其他信息,請告訴我應該提供什麼。 –

+0

@hoppe_pr檢查更新。 – Masoud