2012-01-19 2 views
3

나는 단순 해 보이지만 약간의 어려움을 증명하려고 노력하고 있으므로 누군가가 도울 수 있기를 바랍니다!평균 월 및 롤링 데이터를 기준으로 한 값의 차이

Lines <-"1971-01-17 298.9197 
1971-01-17 298.9197 
1971-02-16 299.0429 
1971-03-17 299.0753 
1971-04-17 299.3250 
1971-05-17 299.5606 
1971-06-17 299.2380 
2010-07-14 298.7876 
2010-08-14 298.5529 
2010-09-14 298.3642 
2010-10-14 297.8739 
2010-11-14 297.7455 
2010-12-14 297.4790" 

DF <- read.table(textConnection(Lines), col.names = c("Date", "Value")) 

DF$Date <- as.Date(DF$Date) 

mean.ts <- aggregate(DF["Value"], format(DF["Date"], "%m"), mean) 

이 생산 :
나는 온도의 관측의 시계열이

> mean.ts 
    Date Value 
1 01 1.251667 
2 02 1.263333 

이 그냥 예입니다 - 내 데이터는 몇 년 동안입니다 그래서 전체 월 평균을 계산할 수 있습니다 데이터의
내가 원하는 것은 위에서 계산 한 평균 1 월의 모든 1 월 (개별)의 차이를 계산하는 것입니다.

날짜/시간 클래스 사용을 중단하면 일부 루프에서이 작업을 수행 할 수 있지만 R에서이 작업을 수행 할 수있는 "깔끔한"방법이 있는지 알고 싶습니다. 어떤 아이디어?

+0

코드를 약간 정리했지만'mean.ts'가 (즉, 1을 약간 넘는) 말을 얻지 못합니다. – James

+0

작은 팁. 2.14부터,'read.table'는'text' 인자를 가지고 있습니다. –

+0

'format'은 여전히 ​​IMO가 더 쉽지만'as.POSIXlt (DF [[ "Date"]]) $ mon'도 사용할 수 있습니다. –

답변

1

연도를 집계 변수로 추가하기 만하면됩니다. 이 수식 인터페이스를 사용하여 쉽게 :

> aggregate(Value~format(Date,"%m")+format(Date,"%Y"),data=DF,mean) 
    format(Date, "%m") format(Date, "%Y") Value 
1     01    1971 298.9197 
2     02    1971 299.0429 
3     03    1971 299.0753 
4     04    1971 299.3250 
5     05    1971 299.5606 
6     06    1971 299.2380 
7     07    2010 298.7876 
8     08    2010 298.5529 
9     09    2010 298.3642 
10     10    2010 297.8739 
11     11    2010 297.7455 
12     12    2010 297.4790 
1

나는 당신이 그 달의 평균이 각 달의 차이를 원하는 당신의 질문을 이해, 그래서 당신은 아마 당신은 집계가 아닌 ave를 사용하려면 최소한 :

diff.mean.ts <- ave(DF[["Value"]], 
         list(format(DF[["Date"]], "%m")), FUN=function(x) x-mean(x)) 

같은 dataframe에서 그것을 원하는 경우에, 다만 컬럼으로 지정 :

DF$ diff.mean.ts <- diff.mean.ts 

ave 기능입니다 첫 번째 인수 (이 경우 DF [[ "Value"])에있는 값의 수와 동일한 길이의 벡터를 반환하기 때문에 기존 데이터 프레임에 열을 추가하기 위해 설계되었습니다. 현재 인스턴스에서는 매월 하나의 값만 있기 때문에 정답 인 모든 0을 반환합니다.

+0

고마워요! 이것은 정확히 내가 한 것입니다! –