Mam wektor wartości, które chciałbym zgłosić średnią w oknach wzdłuż mniejszego slajdu.
Na przykład dla wektora następujących wartości:
4, 5, 7, 3, 9, 8
Okno o rozmiarze 3 i slajd 2 wykonałyby następujące czynności:
(4+5+7)/3 = 5.33
(7+3+9)/3 = 6.33
(9+8)/3 = 5.67
I zwróć wektor tych wartości:
5.33, 6.33, 5.67
Czy istnieje prosta funkcja, która zrobi to za mnie? Jeśli zwróci również indeksy okna startowego, byłby to dodatkowy bonus. W tym przykładzie byłoby to 1,3,5
Odpowiedzi:
Funkcja
rollapply
w pakiecie zoo zbliża:Po prostu nie obliczy dla ciebie ostatniej wartości, ponieważ nie zawiera 3 obserwacji. Może to wystarczy dla twojego prawdziwego problemu? Zwróć również uwagę, że zwracany obiekt ma indeksy, które chcesz jako
names
zwróconego wektora.Twój przykład zakłada, że w ostatnim oknie jest nieobserwowane 0. Bardziej użyteczne lub realistyczne może być wypełnienie za pomocą przycisku,
NA
aby przedstawić brakujące informacje i nakazaćmean
obsługę brakujących wartości. W tym przypadku będziemy mieli (8 + 9) / 2 jako naszą ostateczną wartość okna.źródło
x<-c(x,0)
), aby uzyskać ostatni element odpowiedzi.na.rm = TRUE
argumentmean
. Odpowiedź nie będzie taka sama, jak wymagana przez PO, ale wydaje się bardziej przydatna. Zmodyfikuję swoją odpowiedź, aby to uwzględnić.Rollapply działa świetnie z małym zestawem danych. Jeśli jednak pracujesz z kilkoma milionami wierszy (genomika), jest to dość powolne.
Następująca funkcja jest bardzo szybka.
http://coleoguy.blogspot.com/2014/04/sliding-window-analysis.html
źródło
-1
(do zakresu) i a+1
(do pętli).Ta prosta linia kodu ma tę funkcję:
jeśli
x
jest to wektor.źródło
(c(0,0,x)+c(0,x,0)+c(x,0,0))/3
co mam na myśli (i jak to działa). Właściwą formułą byłoby:(c(0,0,x)+c(0,x,0)+c(x,0,0))[1:(length(x)-3)*2+1]/3
(musimy wyciąć 0-padding na początku i wtedy wybrać parzyste elementy.lub
źródło
odpowiedź shabbychef w R:
EDYCJA: Wskaźniki, których szukasz, są po prostu
idx1
... tę funkcję można łatwo zmodyfikować, aby je również zwrócić, ale odtworzenie ich przy użyciu innego wywołania jest prawie równie szybkieseq(1,length(x),by=slide)
.źródło
fromo::running_mean
najnowszej wersji mojego pakietu fromo .Mogę to łatwo zrobić w Matlabie i uchylić się, gdy głosujesz na mnie:
jako efekt uboczny
idx1
jest indeks elementu w sumie. Jestem pewien, że można to łatwo przetłumaczyć na R. Idiomfirst:skip:last
w Matlabie daje tablicę pierwszy, pierwszy + pomiń, pierwszy + 2skip, ..., pierwszy + n pomiń, gdzie ostatni element w tablicy nie jest większy niżlast
.edycja : Pominąłem część uśredniającą (podziel przez
windowsize
).źródło
Spowoduje to wyświetlenie okna i indeksu pierwszej wartości okna:
Obowiązują różne zastrzeżenia: nie przetestowałem tego na niczym innym, jak na przykładowych danych; Uważam, że dołączanie do takich ramek danych może być bardzo wolne, jeśli masz wiele wartości (ponieważ spowoduje to skopiowanie data.frame za każdym razem); itd. Ale produkuje to, o co prosiłeś.
źródło
rollapply
).rollapply
jest znacznie łatwiejszy do zrozumienia i zaspokajania intencji. Ponadto,rollapply
jest prawdopodobne, aby mieli o wiele więcej gałek ocznych sprawdzenie jego kodu niż coś mogę gotować jedno popołudnie. Konie na kursy.[i:(i+2)]
na[i:(i+win.size-1)]
uczyniłaby kod bardziej ogólnym.