2013-04-24 36 views
6

Trong gói sở thú có một hàm gọi là rollmean, cho phép bạn tạo các đường trung bình động. rollmean(x,3) sẽ lấy giá trị trước đó, hiện tại và tiếp theo (ví dụ 4, 6 và 2) trong bảng bên dưới. Điều này được thể hiện trong cột thứ hai.Di chuyển trung bình của ba giá trị trước đó trong R

x rollmean ma3 
4  
6 4.0 
2 4.3 
5 3.0   4.0 
2 6.3   4.3 
12 6.0   3.0 
4 6.0   6.3 
2    6.0 

Tôi muốn hoàn thành công việc tương tự, nhưng bằng cách tính trung bình 3 giá trị trước đó trong hàng thứ tư. Điều này được hiển thị trong cột thứ ba. Ai có thể cho tôi biết tên của chức năng sẽ giúp thực hiện điều này?

+2

Bạn có thể sử dụng 'lọc (x, đại diện (1/3,3), bên = 1)' – rinni

Trả lời

2

tôi phải vật lộn tìm kiếm một chức năng đơn giản để di chuyển trung bình mà đã có một số linh hoạt để làm những gì tôi cần. Cuối cùng tôi đã viết một vài hàm mở rộng hàm dựa trên hàm lọc mà rinni đưa ra ở trên trong chú thích (nhưng chính nó sẽ không hoạt động vì nó sẽ bao gồm quan sát hiện tại trong trung bình 3 kỳ).

  1. Moving chức năng trung bình bao gồm các quan sát hiện

    mav <- function(x,n){filter(x,rep(1/n,n), sides=1)} 
    
  2. Moving chức năng trung bình mà không bao gồm các quan sát hiện

    mavback <- function(x,n){ 
        a<-mav(x,1) 
        b<-mav(x,(n+1)) 
        c<-(1/n)*((n+1)*b - a) 
        return(c) 
    } 
    
  3. ngược tìm kiếm di chuyển chức năng trung bình, chưa kể hiện nay bị ám ảnh, dựa trên số lần đọc [h2] bắt đầu từ [h1] trở lại

    mavback1<-function(x,h1,h2){ 
        a<-mavback(x,h1) 
        b<-mavback(x,h1-h2) 
        c<-(1/h2)*(h1*a -(h1-h2)*b) 
        return(c) 
    } 
    
10

Bạn có thể sử dụng rollmean, nhưng đặt align='right'. Hoặc bạn có thể sử dụng rollmeanr, trong đó có align='right' làm mặc định.

ma3 <- rollmeanr(x[,1],3,fill=NA) 

... nhưng bạn vẫn cần phải làm chậm kết quả. Một giải pháp khác là sử dụng rollapply với một danh sách cho các đối số width:

ma3 <- rollapplyr(x[,1],list(-(3:1)),mean,fill=NA) 
0

Một thực hiện đơn giản hơn về chức năng mavback w_i_l_l dựa trên chức năng MAV mình

mavback <- function(x,n){ filter(x, c(0, rep(1/n,n)), sides=1) }

Các vấn đề liên quan