2011-07-01 40 views
8

tôi có các đối tượng sở thú mà hình như:chia ngày thành các cột khác nhau trong năm, tháng và ngày

đầu (obs)

 Index pp 
1932-01-01 0 
1932-01-02 0.2 
1932-01-03 0 

và tôi muốn chia chỉ số thành 3 cột (năm, tháng và ngày trong các cột riêng biệt) vì vậy tôi có thể thực hiện một số phân tích mỗi ngày trong tháng bằng cách sử dụng ddply.

Tôi không biết nếu nó làm cho bất kỳ sự khác biệt nhưng ngày của tôi được tạo ra sử dụng:

dates <- as.Date(CET[,1], "%d-%m-%Y") 
obs <- xts(CET[,2], dates) 

nơi CET là file gốc với ngày tháng trong cột 1 và pp trong cột 2.

Cảm ơn để giúp đỡ!

Trả lời

16

1) cột. Chúng ta có thể sử dụng lubridate của year/month/day hoặc Sử ký của month.day.year:

1a) cột qua lubridate

library(zoo) 
z <- zoo(1:1000, as.Date("1932-01-01") + 0:999) 

library(lubridate) 
tt <- time(z) 
zz <- cbind(z, year = year(tt), month = month(tt), day = day(tt)) 

1b) cột qua Sử ký

library(zoo) 
z <- zoo(1:1000, as.Date("1932-01-01") + 0:999) 

library(chron) 
zz <- with(month.day.year(time(z)), zoo(cbind(z, day, month, year))) 

2) tổng . Tuy nhiên, chúng tôi không thực sự cần phải tạo cột ở nơi đầu tiên. Chúng tôi chỉ có thể sử dụng aggregate.zoo trực tiếp với các đối tượng sở thú ban đầu, z, sử dụng lubridate hoặc Sử ký hoặc chỉ sử dụng yearmon từ vườn thú tùy thuộc vào những gì nó là bạn muốn làm:

2a) tổng hợp sử dụng lubridate

library(zoo) 
z <- zoo(1:1000, as.Date("1932-01-01") + 0:999) 

library(lubridate) 
aggregate(z, day, mean) 
aggregate(z, month, mean) 
aggregate(z, year, mean) 

2b) tổng hợp sử dụng sử ký

library(zoo) 
z <- zoo(1:1000, as.Date("1932-01-01") + 0:999) 

library(chron) 
mdy <- month.day.year(time(z)) 

aggregate(z, mdy$day, mean) 
aggregate(z, mdy$month, mean) 
aggregate(z, mdy$year, mean) 

# or 
ct <- as.chron(time(z)) 

aggregate(z, days(ct), mean) 
aggregate(z, months(ct), mean) 
aggregate(z, years(ct), mean) 

# days(ct) and years(ct) can actually 
# be shortened to just days and years within the above context 
# (and that would work for months too except they would be out of order) 
aggregate(z, days, mean) 
aggregate(z, years, mean) 

2c) tổng hợp sử dụng yearmon

Nếu chúng ta muốn tóm tắt mỗi năm/tháng chứ không phải lumping tất cả các tháng Tháng một với nhau, tất cả các tháng tháng hai với nhau, vv Sau đó chúng ta cần không phải Sử ký cũng không lubridate nhưng thay vì có thể sử dụng sở thú của yearmon:

library(zoo) 
z <- zoo(1:1000, as.Date("1932-01-01") + 0:999) 

aggregate(z, yearmon, mean) 
5

Bạn có thể thử:

CET$year <- format(CET[,1], "%Y") # year 
CET$month <- format(CET[,1], "%m") # month 
CET$day <- format(CET[,1], "%d") # day 
+1

nhờ nhưng nó không hoạt động: 'Lỗi trong format.default (cấu trúc (as.character (x), tên = tên (x), mờ mờ = (x),: không hợp lệ 'cắt' argument' – sbg

+2

Có vẻ như ngày của bạn là các yếu tố. Bạn có thể sử dụng hàm str() để đảm bảo rằng ngày tháng thực sự là ngày tháng. –

7
dtstr <- as.character(index(CET)) 

CET$yr <- sapply(strsplit(dtstr, "-") , "[", 1) 
CET$mon <- sapply(strsplit(dtstr, "-") , "[", 2) 
CET$dt <- sapply(strsplit(dtstr, "-") , "[", 3) 
+0

nhờ DWin, 'index (CET)' không hoạt động ('Lỗi: không thể tìm thấy hàm" Index "') nhưng thay đổi thành 'dtstr <- as.character (CET [, 1])', hoạt động! – sbg

+1

Rất vui khi bạn đến nơi bạn cần. Lưu ý: Hàm này được viết là 'chỉ mục', không phải' Chỉ mục' –

2
require(lubridate) 
maindata1 <- cbind(maindata1, day=day(maindata1$Date), month=month(maindata1$date), year=year(maindata1$date)) 
+1

Vui lòng thêm một số giải thích về mã và không chỉ là kết xuất mã. –

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