2014-09-12 19 views
9

Với các dữ liệu sau:rollmean với dplyr và magrittr

set.seed(1) 
    data <- data.frame(o=c('a','a','a','a','b','b','b','b','c','c','c','c'), t=c(1,2,3,4,1,2,3,4,1,2,3,4), u=runif(12), v=runif(12)) 
    data 
     o t   u   v 
    1 a 1 0.26550866 0.6870228 
    2 a 2 0.37212390 0.3841037 
    3 a 3 0.57285336 0.7698414 
    4 a 4 0.90820779 0.4976992 
    5 b 1 0.20168193 0.7176185 
    6 b 2 0.89838968 0.9919061 
    7 b 3 0.94467527 0.3800352 
    8 b 4 0.66079779 0.7774452 
    9 c 1 0.62911404 0.9347052 
    10 c 2 0.06178627 0.2121425 
    11 c 3 0.20597457 0.6516738 
    12 c 4 0.17655675 0.1255551 

tôi muốn để tính toán cán bình (gói vườn thú) của u cho mỗi nhóm xác định bởi các o coloumn. Thứ tự cho trung bình cán được thiết lập bởi t. Các trung bình lăn nên được thêm vào như một cột mới vào data.frame.

Tôi muốn sử dụng magrittr và dplyr. Tôi đã thử

data %>% 
     group_by(o) %>% 
     sort(t) %>% 
     select(u) %>% 
     rollmean(3) %>% 
     rbind 

Nhưng điều này sẽ không hiệu quả. Có thể làm điều đó với magrittr và dplyr hay tôi phải làm từng bước một? Các giá trị của o và t là biến trong dữ liệu thực của tôi.

Làm cách nào để điền vào hai hàng đầu tiên?

Trả lời

13

Có thể điều này giúp:

library(dplyr) 
data %>% 
group_by(o) %>% 
mutate(rM=rollmean(u,3, na.pad=TRUE, align="right")) 

Nếu bạn muốn làm cho cả cột, uv

fun1 <- function(x) rollmean(x, 3, na.pad=TRUE, align="right") 
data %>% 
group_by(o) %>% 
mutate_each(funs(fun1), u, v) 
+0

tuyệt vời! Nếu t không được sắp xếp đúng, tôi sử dụng dữ liệu%>% group_by (o)%>% sắp xếp (o, t)%>% biến đổi (rM = rollmean (u, 3, na.pad = TRUE, align = "right")) – JerryWho

+0

@ JerryWho Có, bạn có thể sử dụng 'sắp xếp' khi không được đặt hàng. – akrun

2

Một wrapper linh hoạt hơn xuất phát từ gói rowr. Điều này cho phép các cửa sổ có kích thước khác nhau trong dữ liệu ban đầu của bạn.

data %>% 
group_by(o) %>% 
mutate(MEANS = rollApply(u, fun=mean, window=3, align='right')) 
Các vấn đề liên quan