2012-09-17 18 views
0

我有一個數據幀:如何獲取日期範圍而不是數值?

head(df) 

GMT 
       MSCI ACWI  DJGlbl Russell 1000 Russell Dev S&P GSCI Industrial 
1999-03-01 -0.0070000000 0.0020000000 -0.0010000000 -0.0150000000  -0.0100000000 
1999-03-02 -0.0050352467 0.0009980040 -0.0070070070 -0.0020304569   0.0040404040 
1999-03-03 -0.0020242915 0.0029910269 0.0000000000 -0.0061037640   0.0010060362 
1999-03-04 0.0070993915 0.0029821074 0.0151209677 -0.0010235415   0.0050251256 
1999-03-05 0.0241691843 0.0089197225 0.0218470705 0.0276639344  -0.0120000000 
1999-03-08 0.0039331367 0.0039292731 0.0058309038 -0.0009970090  -0.0020242915 
1999-03-09 0.0029382958 0.0000000000 -0.0028985507 0.0069860279  -0.0010141988 
1999-03-10 0.0078125000 0.0088062622 0.0058139535 0.0118929633   0.0091370558 

我做了計算滾動窗口協方差矩陣與下面的代碼,其中姓名(windowsList)實現是例如1-60 $的前60天cov.matrix和$值2-61用於當窗口被以一天轉向下一個協方差矩陣:

windowSize <- 60 
windows <- embed(1:nrow(df), windowSize) 

lapplyApproach <- function(df, windows) { 

windowsList <- split(t(windows), rep(1:nrow(windows), each=ncol(windows))) 

names(windowsList) <- unlist(lapply(windowsList, function(x)paste(range(x), sep="", collapse="-"))) 
return(lapply(windowsList, function(x)cov(df[x, ]))) 
} 

我的問題是,我想在日期,而不是數字範圍名(windowsList)值。在例如,而不是$ 1-60我想要的東西像$ 1999-03-01 - 1999-05-21。我嘗試製作日期矩陣,然後計算它們之間的範圍,但沒有結果。這個想法是,名稱($ 1999-03-01 - 1999-05-21等)將作爲工作表名稱傳遞給Excel。在例如:

library("XLConnect") 
hb <- loadWorkbook("stuff.xlsx", create = TRUE) 
createSheet(hb, names(windowsList)) 
writeWorksheet(hb,windowsList, names(windowsList),header=TRUE) 
saveWorkbook(hb) 

可能有人親切地指出我在正確的方向:) 問候

回答

0

如果使用rownames(df)[range(x)]它將工作?

df <- read.table(text = "MSCI_ACWI  DJGlbl Russell_1000 Russell-Dev S&P_GSCI_Industrial 
1999-03-01 -0.0070000000 0.0020000000 -0.0010000000 -0.0150000000  -0.0100000000 
1999-03-02 -0.0050352467 0.0009980040 -0.0070070070 -0.0020304569   0.0040404040 
1999-03-03 -0.0020242915 0.0029910269 0.0000000000 -0.0061037640   0.0010060362 
1999-03-04 0.0070993915 0.0029821074 0.0151209677 -0.0010235415   0.0050251256 
1999-03-05 0.0241691843 0.0089197225 0.0218470705 0.0276639344  -0.0120000000 
1999-03-08 0.0039331367 0.0039292731 0.0058309038 -0.0009970090  -0.0020242915 
1999-03-09 0.0029382958 0.0000000000 -0.0028985507 0.0069860279  -0.0010141988 
1999-03-10 0.0078125000 0.0088062622 0.0058139535 0.0118929633   0.0091370558", header = TRUE) 

windowSize <- 6 
windows <- embed(1:nrow(df), windowSize) 

我還修改了函數的最後一個命令:df[x, ]沒有工作,因爲x是一個列表。所以,我用df[unlist(x),]代替。

lapplyApproach <- function(df, windows) { 
windowsList <- split(t(windows), rep(1:nrow(windows), each=ncol(windows))) 
names(windowsList) <- unlist(lapply(windowsList, 
      function(x) paste(rownames(df)[range(x)], sep="", collapse=" - "))) 
return(lapply(windowsList, function(x) cov(df[unlist(x),]))) 
} 

輸出:

lapplyApproach(df, windows) 

$`1999-03-01 - 1999-03-08` 
         MSCI_ACWI  DJGlbl Russell_1000 Russell.Dev S.P_GSCI_Industrial 
MSCI_ACWI   1.307947e-04 3.004810e-05 1.155990e-04 1.552330e-04  -3.310649e-05 
DJGlbl    3.004810e-05 7.696563e-06 2.547058e-05 3.607536e-05  -1.244441e-05 
Russell_1000   1.155990e-04 2.547058e-05 1.176579e-04 1.195526e-04  -2.707752e-05 
Russell.Dev   1.552330e-04 3.607536e-05 1.195526e-04 2.065329e-04  -3.872039e-05 
S.P_GSCI_Industrial -3.310649e-05 -1.244441e-05 -2.707752e-05 -3.872039e-05  5.164804e-05 

... 
+0

大答案斯文!你可能有一個想法,我可以如何將窗口矩陣子集包括在每個cov.matrix計算中使用的最後一個觀察值是每個月的最後一天的協方差矩陣?我想'grep'函數的東西...現在我在Excel中手動子集窗口矩陣...否則,如果你有一些關於如何分離Excel文件中的協方差矩陣的想法?因爲我無法設法將它們與一些空間分開..最好的問候 – user1665355