2012-06-12 65 views
9

對R而言,我很新,所以如果在解釋這個問題時遇到任何術語錯誤,我都會很抱歉。Pull從XTS對象的月份的第一個工作日返回使用R

我有一套每日退貨數據在一個csv文件中,我已經設法轉換爲一個xts對象。該數據的格式爲:

  HighYield..EUR. MSCI.World..EUR. 
2002-01-31   0.0144   0.0031  
2002-02-01   0.0056   -0.0132  
2002-02-02   0.0373   0.0356  
2002-02-03   -0.0167   -0.0644  
2002-02-04   -0.0062   -0.0332  
2002-02-05   -0.0874   -0.1112 
... 

我想創建一個腳本,會發現在每月的第一個工作日(從值的指數範圍內),然後創建一個新的XTS這些返回對象在裏面。

例如,腳本運行後,我會在格式的XTS對象:

  HighYield..EUR. MSCI.World..EUR. 
2002-01-31   0.0144   0.0031  
2002-02-28   0.0011   -0.0112  
2002-03-31   0.0222   0.0224  
2002-04-30   -0.0333   -0.0223  
2002-05-30   -0.0011   -0.0012  
2002-06-30   -0.0888   -0.0967 
... 

有人能幫助我嗎?並且如果可能的話,解釋腳本的每個部分都在做什麼。

+0

你舉的例子顯示了每個最後一天一個月,但不管。有很多方法可以提取特定的日期,直到(僞代碼)'if(month(dateval [i]> month(dateval [i-1])){{copy this i th th row to output}')。首先看看'lubridate'軟件包的日期相關功能 –

回答

11

得益於基礎R語言的力量,你可以這樣做在同一行:

library(xts) 
data(sample_matrix) 
x <- as.xts(sample_matrix) 
do.call(rbind, lapply(split(x, "months"), first)) 

要解釋每一步都做:

# Split the xts object into a list with an element for each month. 
x1 <- split(x, "months") 
# Loop over the list (x1) and call the first() function on each element. 
# This returns a new list where each element only contains the first observation 
# from each respective element in x1. 
x2 <- lapply(x1, first) 
# Call rbind() with all the elements of x2 as arguments to rbind() 
# Same as rbind(x2[[1]], x2[[2]], ..., x2[[N]]) 
x3 <- do.call(rbind, x2) 
+0

約書亞,你是一個學者和紳士,我是你的債務 – GreenyMcDuff

+0

如果我們假設「第一個工作日」是字面上排除星期六和星期天,我們不應該使用'do.call(rbind,lapply(split%(x [.indexwday(x)%in%1:5],「months」),first))'?或者是否存在偶數更好的方式與「xts」做到這一點? – A5C1D2H2I1M1N2O1R2T1

+0

@mrdwab:是的,這是一個很好的觀點,我的答案假設對象只包含工作日,你的更好,但仍不排除任何潛在的假期。[timeDate]( http://cran.r-project.org/web/packages/timeDate/index.html)包有很好的功能 –

相關問題