2012-06-12 26 views
9

Tôi rất mới với R vì vậy xin lỗi nếu tôi nhận được bất kỳ thuật ngữ nào sai khi tôi giải thích vấn đề này.Kéo trở lại từ ngày làm việc đầu tiên của tháng từ đối tượng XTS sử dụng R

Tôi có bộ dữ liệu trả về hàng ngày trong tệp csv mà tôi đã quản lý để chuyển đổi thành đối tượng xts. Các dữ liệu có định dạng:

  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 
... 

Tôi muốn tạo ra một kịch bản mà sẽ tìm thấy những ngày làm việc đầu tiên của tháng (từ dãy các giá trị trong các index) và sau đó tạo ra một XTS mới phản đối với những lợi nhuận trong đó.

Ví dụ, sau khi kịch bản đã chạy tôi sẽ có một đối tượng XTS trong định dạng:

  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 
... 

Ai đó có thể giúp tôi xin vui lòng? và nếu có thể giải thích những gì từng phần của kịch bản đang làm.

+0

dụ của bạn cho thấy ngày cuối cùng của mỗi tháng, nhưng không có vấn đề gì. Có rất nhiều cách để kéo các ngày cụ thể, lên đến các kludges như (giả) 'if (tháng (dateval [i]> tháng (dateval [i-1]) sau đó {sao chép hàng thứ i này vào đầu ra}'. Bắt đầu bằng cách xem gói 'lubridate' cho các hàm có liên quan đến ngày hữu ích –

Trả lời

11

Nhờ sức mạnh của ngôn ngữ cơ sở R, bạn có thể làm điều này trong một dòng:

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

Để giải thích những gì từng bước được thực hiện:

# 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

Joshua, bạn là một học giả và một quý ông. Tôi mắc nợ của bạn – GreenyMcDuff

+0

Nếu chúng ta giả định" ngày làm việc đầu tiên " Thứ Bảy và Chủ Nhật, chúng ta không nên sử dụng 'do.call (rbind, lapply (split (x [.indexwday (x)% trong% 1: 5]," months "), đầu tiên))'? Hoặc có một thậm chí cách tốt hơn với "xts" để làm điều này? – A5C1D2H2I1M1N2O1R2T1

+0

@mrdwab: vâng, đó là một điểm tốt. Câu trả lời của tôi giả định đối tượng chỉ chứa ngày làm việc. Trân trọng hơn, nhưng vẫn không loại trừ bất kỳ ngày lễ tiềm năng nào. [timeDate] (http://cran.r-project.org/web/packages/timeDate/index.html) gói có chức năng tốt cho điều đó –

Các vấn đề liên quan