2014-09-12 5 views
9

Учитывая следующие данные:rollmean с dplyr и 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 

Я хочу, чтобы вычислить среднее качению (пакет зоопарк) от и в группе, определяемой coloumn о. Порядок для среднего значения проката устанавливается равным t. Среднее значение качения должно быть добавлено в качестве нового столбца в data.frame.

Я хочу использовать magrittr и dplyr. Я попробовал

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

Но это не сработает. Можно ли это сделать с помощью magrittr и dplyr, или я должен делать это шаг за шагом? Значения o и t являются переменными в моих реальных данных.

Как заполнить первые две строки?

ответ

13

Может быть, это помогает:

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

Если вы хотите сделать для обеих колонок, u и v

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

отлично! Если t не упорядочено правильно, я использую данные%>% group_by (o)%>% arrate (o, t)%>% mutate (rM = rollmean (u, 3, na.pad = TRUE, align = "right")) – JerryWho

+0

@JerryWho Да, вы можете использовать 'аранжировать', когда не заказывали. – akrun

2

Более гибкая обертка происходит от rowr пакета. Это позволяет создавать окна разного размера в ваших исходных данных.

data %>% 
group_by(o) %>% 
mutate(MEANS = rollApply(u, fun=mean, window=3, align='right'))