2014-02-21 95 views
0

我有一個數據幀,它看起來像Rollapply打破並重新開始在R?

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

我使用功能

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

來計算標準偏差。

我想要做的事情是,功能突破,並開始重新計算標準偏差 如果連續三年之間的間隙。

編輯:

我的樣本輸出應該是這樣的:

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 

注第一次如何每個差距後的兩個條目都是NA,因爲您的窗口至少需要三個值。

基本上,我們在這裏做什麼用cumsumdiff弄清楚的連續多年的塊,然後,我們可以使用ave申請sd每個塊。請注意,如果您有多年的時間(例如,1997年顯示2次或更多次),或者您的數據未按年份排序,則此次數將會中斷。

+0

傑出!謝謝 – Jack

1

將data.frame轉換爲動物園對象z,並將其與所有年份的網格g合併,包括z中找不到的網格。適用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 

r是一個動物園對象爲其time(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

我必須粘貼錯誤的輸出。我現在再次運行它並粘貼正確的輸出。代碼沒有改變。 –