2014-02-21 1 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') 

для вычисления стандартного отклонения.

Вещь, которую я хочу сделать, заключается в том, что функция прерывается и начинает вычислять стандартное отклонение снова, если есть разрыв между последовательными годами.

EDIT:

Мой вывод должен выглядеть следующим образом:

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, потому что вам нужно как минимум три значения в вашем окне.

В принципе, что мы делаем здесь использовать cumsum и diff, чтобы выяснить, блоки смежных лет, а затем, что мы можем использовать 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

Я, должно быть, вставил неправильный вывод. Теперь я снова запустил его и вставил правильный вывод. Код не изменился. –