2014-01-07 3 views
2

나는 이것이 매우 까다로운 것으로 판명되었습니다. 나는 R 시리즈의 데이터 프레임을 가지고 있는데, 약 50 년간의 데이터에 대한 매일의 값으로 구성됩니다. 매월 마지막 5 개 값의 평균을 계산하고 싶습니다. 매월 같은 31 일에 끝난다면 간단 할 것입니다. 그러나 우리 모두는 몇 개월이 31 세가되고 30 세가 몇 살이라는 것을 알기 때문에 윤년이 있습니다. 윤년을 포함한 모든 가능성을 고려하여 복잡한 색인 생성 함수를 작성하지 않고 R에서 이것을 수행하는 간단한 방법이 있습니까? 아마도 동물원 유형의 객체에서 작동하는 함수일까요? dd는 데이터 프레임이며, 우리가 Date 열이 클래스 "Date"의 것으로 가정 한 경우각 달의 마지막 5 일 평균을 계산합니다. R

 Date val 
1 2014-01-06 1.49 
2 2014-01-03 1.38 
3 2014-01-02 1.34 
4 2013-12-31 1.26 
5 2013-12-30 2.11 
6 2013-12-26 3.20 
7 2013-12-25 3.00 
8 2013-12-24 2.89 
9 2013-12-23 2.90 
10 2013-12-22 4.5 
+1

참조 http://stackoverflow.com/questions/8333838/how-do-you-generate-a-sequence-of-the-last-day-of-the-month-over-two-years-in- r –

답변

3

tapply이 시도 : 다음과 같이 데이터 프레임이다. (dd는 이미 우리가 function(x) mean(head(x, 5))와 익명 함수를 대체하여 그것을 조금 단축 할 수는 질문에있을 수 있습니다 나타나는 Date의 내림차순으로 정렬됩니다.)

> tapply(dd$val, format(dd$Date, "%Y-%m"), function(x) mean(tail(sort(x), 5))) 
2013-12 2014-01 
2.492000 1.403333 

aggregate.zoo 측면에서 동물원에서 다른 동물원 객체를 반환하는이 작업을 수행 할 수 있으며 해당 색인은 클래스 "yearmon"입니다. (동물원의 경우는 동물원이 자동으로 분류하기 때문에 dd 정렬 여부는 중요하지 않습니다.)

> library(zoo) 
> z <- read.zoo(dd) 
> aggregate(z, as.yearmon, function(x) mean(tail(x, 5))) 
Dec 2013 Jan 2014 
2.492000 1.403333 

개정 이력합니다. 약간의 수정을했습니다.

+0

큰 감사, 이것은 꽤 잘 작동합니다. tapply가 백그라운드에서 시도한 많은 그룹화/집계를 수행하는 것처럼 보입니다. 나는 또한 적용이 사용자 정의 함수를 입력으로 사용할 수 있다는 것을 인식하지 못했습니다. – user2238328

관련 문제