2014-02-21 2 views
0

가 나는 표준 편차를 계산하는 함수Rollapply가 중단되어 R에서 다시 시작 하시겠습니까?

rollapply(b, 3, sd, align='right') 

를 사용

z<-data.frame(a=c(seq(1990,1995,1), 1997,1998,1999,2001,2002,2003), b=seq(90,101,1)) 

보이는 데이터 프레임을 가지고있다.

내가 원하는 것은 함수가 끊어지고 연속 연도 사이에 간격이 있으면 표준 편차 을 다시 계산하기 시작합니다.

편집 :

내 샘플 출력은 다음과 같아야합니다

enter code here  a b c 
       1 1990 90 NA 
       2 1991 91 NA 
       3 1992 92 sd(90,91,92) 
       4 1993 93 sd(93,92,91) 
       5 1994 94 sd(94,93,92) 
       6 1995 95 sd(95,94,93) 
       7 1997 96 NA 
       8 1998 97 NA 
       9 1999 98 sd(98,97,96) 
       10 2001 99 NA 
       11 2002 100 NA 
       12 2003 101 sd(101,100,99) 
+0

당신은 샘플 출력을 보여줄 수 있습니까? 당신이 묻고있는 것을 이해하는 것은 어렵습니다. –

+0

@ : Jdbaba. 관심을 가져 주셔서 감사합니다. 나는 추가했다. – Jack

+0

'sd (c (90,91,92))'로'sd (c (90,91,92))'를 실행 한 결과를 의미하는 것입니까? – BrodieG

답변

2

나는 이것이 당신이 원하는 것을 생각 :

my.roll <- function(x) rollapply(x, 3, sd, align='right', fill=NA, na.rm=T) 
z$sd <- ave(z$b, c(0, cumsum(diff(z$a) - 1)), FUN=my.roll) 

가 생산 :

 a b sd 
1 1990 90 NA 
2 1991 91 NA 
3 1992 92 1 
4 1993 93 1 
5 1994 94 1 
6 1995 95 1 
7 1997 96 NA 
8 1998 97 NA 
9 1999 98 1 
10 2001 99 NA 
11 2002 100 NA 
12 2003 101 1 

주 어떻게 첫 번째 창에 최소 3 개의 값이 필요하기 때문에 각 간격 다음에 2 개의 항목이 NA가됩니다.

기본적으로, 우리가 여기서하는 일은 연속 년간의 블록을 알아 내기 위해 cumsumdiff를 사용하고, 그와 함께 우리는 각 블록에 sd을 적용 ave를 사용할 수 있습니다. 반복 된 연도가있는 경우 (예 : 1997 년이 2 회 이상 표시됨) 또는 데이터가 연도별로 정렬되지 않은 경우이 오류가 발생합니다.

+0

뛰어난! 감사합니다 – Jack

1

data.frame을 동물원 개체 z으로 변환하고 z에없는 것을 포함하여 모든 연도의 g 그리드와 병합합니다. 그것 rollapplyr를 적용하고 원래의 시간을 추출 :

library(zoo) 

z <- read.zoo(DF, FUN = identity) 
g <- merge(z, zoo(, start(z):end(z))) 
r <- rollapplyr(g, 3, sd, fill = NA)[I(time(z))] 

제공 :

> r 
1990 1991 1992 1993 1994 1995 1997 1998 1999 2001 2002 2003 
    NA NA 1 1 1 1 NA NA 1 NA NA 1 

rtime(r)는 배와 coredata(r) 데이터되는 동물원 개체입니다.

:는 우리가 사용하고 있습니다 :

DF <- structure(list(V1 = c(1990L, 1991L, 1992L, 1993L, 1994L, 1995L, 
    1997L, 1998L, 1999L, 2001L, 2002L, 2003L), V2 = 90:101), .Names = c("V1", 
    "V2"), class = "data.frame", row.names = c(NA, -12L)) 
+0

잘못된 출력을 붙여 넣었어야합니다. 이제 다시 실행하고 올바른 출력을 붙여 넣었습니다. 코드는 변경되지 않았습니다. –

관련 문제