Saya memiliki vektor nilai yang ingin saya laporkan rata-rata di jendela sepanjang slide yang lebih kecil.
Misalnya, untuk vektor dengan nilai berikut:
4, 5, 7, 3, 9, 8
Ukuran jendela 3 dan slide 2 akan melakukan hal berikut:
(4+5+7)/3 = 5.33
(7+3+9)/3 = 6.33
(9+8)/3 = 5.67
Dan kembalikan vektor nilai-nilai ini:
5.33, 6.33, 5.67
Apakah ada fungsi sederhana yang akan melakukan ini untuk saya? Jika itu juga mengembalikan indeks mulai jendela yang akan menjadi bonus tambahan. Dalam contoh ini akan menjadi 1,3,5
Jawaban:
Fungsi
rollapply
dalam paket kebun binatang membuat Anda dekat:Itu tidak akan menghitung nilai terakhir untuk Anda karena tidak mengandung 3 pengamatan. Mungkin ini akan cukup untuk masalah Anda yang sebenarnya? Juga, perhatikan bahwa objek yang dikembalikan memiliki indeks yang Anda inginkan sebagai
names
vektor yang dikembalikan.Contoh Anda membuat asumsi bahwa ada 0 yang tidak teramati di jendela terakhir. Mungkin lebih bermanfaat atau realistis untuk
NA
mengisi dengan yang mewakili informasi yang hilang dan memberitahumean
untuk menangani nilai yang hilang. Dalam hal ini kita akan memiliki (8 + 9) / 2 sebagai nilai windowed terakhir kita.sumber
x<-c(x,0)
) untuk mendapatkan elemen jawaban terakhir.na.rm = TRUE
argumenmean
. Jawabannya tidak akan sama dengan apa yang diminta OP, tetapi tampaknya lebih bermanfaat. Saya akan mengedit jawaban saya untuk memasukkan ini.Rollapply berfungsi baik dengan dataset kecil. Namun, jika Anda bekerja dengan beberapa juta baris (genomik) itu cukup lambat.
Fungsi berikut ini sangat cepat.
http://coleoguy.blogspot.com/2014/04/sliding-window-analysis.html
sumber
-1
(ke kisaran) dan a+1
(ke loop).Baris kode sederhana ini berfungsi:
jika
x
vektor yang dimaksud.sumber
(c(0,0,x)+c(0,x,0)+c(x,0,0))/3
untuk melihat apa yang saya maksud (dan bagaimana cara kerjanya). Rumus yang tepat adalah:(c(0,0,x)+c(0,x,0)+c(x,0,0))[1:(length(x)-3)*2+1]/3
(kita harus memotong 0-padding di awal dan memilih elemen genap kemudian.atau
sumber
Jawaban shabbychef dalam R:
Sunting: Indeks yang Anda cari hanyalah
idx1
... fungsi ini dapat dengan mudah dimodifikasi untuk mengembalikannya juga, tetapi hampir sama cepatnya untuk membuatnya kembali dengan panggilan lainseq(1,length(x),by=slide)
.sumber
fromo::running_mean
dari versi tepi pendarahan dari paket fromo saya .Saya dapat melakukan ini dengan mudah di Matlab dan bebek saat Anda menurunkan saya:
sebagai efek samping,
idx1
adalah indeks elemen dalam penjumlahan. Saya yakin ini dapat dengan mudah diterjemahkan ke dalam R. Idiomfirst:skip:last
di Matlab memberikan array pertama, pertama + lompati, pertama + 2 lompati, ..., pertama + n lompati, di mana elemen terakhir dalam array tidak lebih besar darilast
.sunting : Saya telah menghilangkan bagian rata-rata (bagi dengan
windowsize
).sumber
Ini akan memberi Anda sarana jendela dan indeks nilai pertama dari jendela:
Berbagai peringatan berlaku: belum diuji terhadap apa pun selain data sampel Anda; Saya percaya bahwa menambahkan frame data seperti ini bisa sangat lambat jika Anda memiliki banyak nilai (karena itu akan menyalin data.frame setiap kali); dll. Tapi itu menghasilkan apa yang Anda minta.
sumber
rollapply
).rollapply
jauh lebih mudah dipahami dan dipahami maksudnya. Juga,rollapply
kemungkinan memiliki lebih banyak bola mata memeriksa kodenya daripada sesuatu yang mungkin saya masak suatu sore. Kuda untuk kursus.[i:(i+2)]
ke[i:(i+win.size-1)]
akan membuat kode lebih umum, saya pikir.