2011-12-15 38 views
9

Tôi có một tập dữ liệu, cột đầu tiên trong số đó là ngày theo định dạng Năm-Quarter, như sauLàm cách nào để đọc chuỗi dữ liệu hàng quý vào ngày R?

1959-I 
1959-II 
1959-III 
1959-IV  
1960-I 
1960-II 
1960-III 
1960-IV 

tôi đã nhập dữ liệu vào R, nhưng tôi không biết làm thế nào để chuyển đổi này để Date định dạng bằng cách sử dụng chức năng as.Date, vì there doesn't appear to be a conversion specification for quarters và tôi đã chỉ mới bắt đầu học R.

điều tốt nhất tôi có thể nghĩ đến là cái gì đó như

#extract the year 
> dates <- substring(data$X,1,4) 
> dates[1:8] 
[1] "1959" "1959" "1959" "1959" "1960" "1960" "1960" "1960" 
> dates <- as.numeric(dates) 

#extract the quarter 
> quarters <- substring(data$X,6) 
> quarters[1:10] 
[1] "I " "II " "III " "IV " "I " "II " "III " "IV " 

nhưng điều này có thể không phải là cách tốt nhất để làm điều này, và nó vẫn còn lại cho tôi vấn đề làm thế nào để đối phó với hàng loạt của tôi quarters. Để làm cho vấn đề tồi tệ hơn, có một ký tự trống ở cuối mỗi ký tự tôi không biết làm thế nào để đối phó với vì có 3 "lenghts" khác nhau cho các chuỗi quý.

Một lựa chọn khác, tất nhiên, sẽ được chế tạo hàng loạt quý của riêng tôi, với một cái gì đó giống như

quarters <- rep(c(1,2,3,4),dates[length(dates)]-dates[1]) 

(tôi khá tự hào về bản thân mình vì đã viết dòng cuối cùng này!).

Vì vậy, câu hỏi của tôi: là có cách tích hợp để nhập dữ liệu hàng quý theo định dạng tôi có trong R và nếu không có bất kỳ định dạng nào khác (vẫn cho dữ liệu hàng quý)? Bất kỳ đề xuất nào về cách tốt nhất để tiếp tục?

+0

Có đủ để chỉ định ngày cho mỗi giá trị quý không? tức là 'I = 01/01, II = 04/01, III = 07/01, IV = 10/01' hoặc tương tự? – Chase

+0

@Chase, điều tôi thực sự băn khoăn là liệu R có nhận ra dữ liệu hàng quý hay không, giống như cách nó nhận ra năm, tháng, v.v. Nếu không, thì tôi sẽ phải làm điều gì đó khác và đề xuất của bạn chắc chắn là một lựa chọn (nhưng chắc chắn R , một gói thống kê, được phát triển tốt, sẽ có sẵn một giải pháp thay thế?) – Vivi

+0

Tôi có thể cung cấp cho bạn một giải pháp đã sẵn sàng đi xuống con đường đầu tiên, nhưng bạn có nhiều khả năng nhất lại: được xây dựng thay thế. Có vẻ như các đối tượng 'ts' hỗ trợ dữ liệu hàng quý thông qua tham số' frequency = 4'. Bạn cũng có thể xem [CRAN Task View for Time Sieres] (http://cran.r-project.org/web/views/TimeSeries.html). Từ những gì tôi thấy, các gói sở thú và xts cũng khá mạnh mẽ và linh hoạt, vì vậy chúng có thể có thứ gì đó được cuộn lên. Tôi đặt cược một người nào đó sẽ đến cùng sớm và cho chúng tôi thấy một cái gì đó tất cả fancylike. – Chase

Trả lời

15

Giả sử chúng tôi có dữ liệu 1: 8 tương ứng với 8 quý mà bạn đề cập. Sau đó, chúng ta có thể làm điều này:

ts(1:8, start = c(1959, 1), frequency = 4) 
##  Qtr1 Qtr2 Qtr3 Qtr4 
## 1959 1 2 3 4 
## 1960 5 6 7 8 

Cũng gói vườn thú có lớp "yearqtr":

library(zoo) 

z <- zooreg(1:8, start = as.yearqtr("1959-1"), frequency = 4) 
z 
## 1959 Q1 1959 Q2 1959 Q3 1959 Q4 1960 Q1 1960 Q2 1960 Q3 1960 Q4 
##  1  2  3  4  5  6  7  8 

Nếu chúng ta thực sự đã có một vector của quý như vậy mà không nhất thiết phải liên tiếp:

dt <- c("1959-I", "1959-II", "1959-III", "1959-IV", "1960-I", "1960-II", 
     "1960-III", "1960-IV") 

chúng tôi có thể chuyển đổi chúng bằng cách sử dụng gsubfn:

library(gsubfn) 

g <- gsubfn("I.*", list(`I` = 1, `II` = 2, `III` = 3, `IV` = 4), dt) 
g 
## [1] "1959-1" "1959-2" "1959-3" "1959-4" "1960-1" "1960-2" "1960-3" "1960-4" 

as.yearqtr(g) 
## [1] "1959 Q1" "1959 Q2" "1959 Q3" "1959 Q4" "1960 Q1" "1960 Q2" "1960 Q3" 
## [8] "1960 Q4" 
Các vấn đề liên quan