2012-02-27 48 views
5

Tôi có hai ngàyngày Đếm mỗi năm

begin <- as.Date("2007-05-20") 
end <- as.Date("2010-06-13") 

Làm thế nào tôi có thể đếm số ngày mỗi năm?

Sản lượng nên có thể trông giống như

year days 
2007 226 
2008 366 
2009 365 
2010 164 

Trả lời

11

Hãy đầu tiên tạo ra một chuỗi ngày thích hợp:

R> bd <- as.Date("2007-05-20") 
R> ed <- as.Date("2010-06-13") 
R> seqd <- seq(bd, ed, by="1 day") 
R> head(seqd) 
[1] "2007-05-20" "2007-05-21" "2007-05-22" "2007-05-23" "2007-05-24" "2007-05-25" 

Sau đó chúng tôi tạo một hàm helper đó, được đưa ra một ngày, trở về năm của nó:

R> getYear <- function(d) as.POSIXlt(d)$year + 1900 
R> getYear(head(seqd)) 
[1] 2007 2007 2007 2007 2007 2007 

Sau đó, chúng ta chỉ cần gọi table() trên những gì người trợ giúp trả về từ chuỗi ngày:

R> table(getYear(seqd)) 

2007 2008 2009 2010 
226 366 365 164 
+3

Một biến thể nhỏ ở trên sẽ là: 'bảng (định dạng (seq (bd, ed," ngày "),"% Y "))' –

+0

Đẹp một Gabor. Tôi không thể nhớ là bộ chiết xuất ngắn gọn nhất; phiên bản của bạn chắc chắn đủ điều kiện. –

1

Something này như thế này nên làm như lừa:

function daysPerYear(begin, end) 
{ 
    var days = {}; 
    for (var y = begin.getFullYear(); y < end.getFullYear(); y++) 
    { 
     days[y] = Math.ceil((new Date(y+1, 0, 1) - begin)/86400000); 
     begin = new Date(y+1, 0, 1); 
    } 
    days[ end.getFullYear() ] = Math.ceil((end - begin)/86400000); 
    return days; 
} 

mẫu:

console.log(daysPerYear(new Date("2007-05-20"), new Date("2010-06-13"))); 

http://puu.sh/iBgo

Chỉnh sửa: Tôi nghĩ đây là về Javascript.

+0

yea Tôi đã tự hỏi :) nhưng tốt mã hóa anyway! – speendo

2

Hoặc, cách khác tạo một data.frame với một cột bổ sung year (sử dụng dữ liệu Dirk của):

dat = data.frame(seqd, year = strftime(seqd, "%Y")) 
> head(dat) 
     seqd year 
1 2007-05-20 2007 
2 2007-05-21 2007 
3 2007-05-22 2007 
4 2007-05-23 2007 
5 2007-05-24 2007 
6 2007-05-25 2007 

và sau đó sử dụng count từ gói plyr:

require(plyr) 
> count(dat, "year") 
    year freq 
1 2007 226 
2 2008 366 
3 2009 365 
4 2010 164 
1

Một giải pháp chuyên sâu ít bộ nhớ sẽ là, mặc dù không phải là một lót:)

begin <- as.POSIXlt("2007-05-20", tz = "GMT") 
end <- as.POSIXlt("2010-06-13", tz = "GMT") 

year <- seq(begin$year, end$year) + 1900 
year.begin <- as.POSIXlt(paste(year, "01", "01", sep="-"), tz="GMT") 
year.begin[1] <- begin 
year.end <- as.POSIXlt(paste(year, "12", "31", sep="-"), tz="GMT") 
year.end[length(year.end)] <- end 
days <- as.numeric(year.end - year.begin) + 1 
cbind(year, days) 

Thúc đẩy bởi Make this process more processor intensive and less memory intensive

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