Eu tenho um vetor de valores que gostaria de relatar a média nas janelas ao longo de um slide menor.
Por exemplo, para um vetor dos seguintes valores:
4, 5, 7, 3, 9, 8
Um tamanho de janela de 3 e um slide de 2 faria o seguinte:
(4+5+7)/3 = 5.33
(7+3+9)/3 = 6.33
(9+8)/3 = 5.67
E retorne um vetor desses valores:
5.33, 6.33, 5.67
Existe uma função simples que fará isso por mim? Se também retornasse os índices da janela, isso seria um bônus adicional. Neste exemplo, isso seria 1,3,5
Respostas:
A função
rollapply
no pacote zoo aproxima você:Ele simplesmente não computará o último valor para você, pois não contém 3 observações. Talvez isso seja suficiente para o seu problema real? Além disso, observe que o objeto retornado possui os índices desejados como o
names
vetor retornado.Seu exemplo está assumindo que há um 0 não observado na última janela. Pode ser mais útil ou realista preencher com um
NA
para representar as informações ausentes e dizermean
para manipular os valores ausentes. Nesse caso, teremos (8 + 9) / 2 como nosso valor final de janela.fonte
x<-c(x,0)
) para obter o último elemento de resposta.na.rm = TRUE
discussão paramean
. A resposta não será a mesma que o OP solicitou, mas parece mais útil. Vou editar minha resposta para incluir isso.Rollapply funciona muito bem com um pequeno conjunto de dados. No entanto, se você estiver trabalhando com vários milhões de linhas (genômica), é bastante lento.
A seguinte função é super rápida.
http://coleoguy.blogspot.com/2014/04/sliding-window-analysis.html
fonte
-1
(ao intervalo) e a+1
(ao loop).Esta simples linha de código faz o seguinte:
se
x
é o vetor em questão.fonte
(c(0,0,x)+c(0,x,0)+c(x,0,0))/3
que quero dizer (e como isso funciona). A fórmula apropriada seria:(c(0,0,x)+c(0,x,0)+c(x,0,0))[1:(length(x)-3)*2+1]/3
(devemos cortar o preenchimento de 0 no início e selecionar os elementos pares então.ou
fonte
resposta de shabbychef em R:
EDIT: Os índices que você está procurando são apenas
idx1
... essa função pode ser facilmente modificada para retorná-los também, mas é quase igualmente rápido recriá-los com outra chamada paraseq(1,length(x),by=slide)
.fonte
fromo::running_mean
da versão mais recente do meu pacote fromo .Eu posso fazer isso facilmente no Matlab e me esquivar enquanto você me rebate:
como efeito colateral,
idx1
é o índice do elemento na soma. Estou certo de que isso pode ser facilmente traduzido em R. O idiomafirst:skip:last
do Matlab fornece ao array primeiro, primeiro + pula, primeiro + 2 pula, ..., primeiro + n pula, onde o último elemento da matriz não é maior quelast
.editar : eu tinha omitido a parte da média (dividir por
windowsize
).fonte
Isso fornecerá os meios da janela e o índice do primeiro valor da janela:
Várias advertências se aplicam: não testei isso contra nada além de dados de amostra; Acredito que anexar quadros de dados como esse pode ficar muito lento se você tiver muitos valores (porque ele copiará o data.frame toda vez); etc. Mas produz o que você pediu.
fonte
rollapply
).rollapply
é muito mais fácil de entender e cumprir a intenção. Além disso,rollapply
é provável que tenha havido muitos mais olhos verificando seu código do que algo que eu possa preparar uma tarde. Cavalos para cursos.[i:(i+2)]
para[i:(i+win.size-1)]
tornaria o código mais geral, eu acho.