2016-02-10 2 views
-3

Я хочу рассчитать групповые значения, но сохранить их как вектор рядом с необработанными данными. Есть ли эффективный способ сделать это в dplyr?Среднее значение как оконная функция в dplyr

Оригинал data.frame:

dat <- data.frame(
    group = c("A","A","A","B","B","B"), 
    value = c(4, 5, 6, 7, 8, 9) 
) 

> dat 
    group value 
1  A  4 
2  A  5 
3  A  6 
4  B  7 
5  B  8 
6  B  9 

Желаемая data.frame с полным вектором группы означает:

dat2 <- data.frame(
    group = c("A","A","A","B","B","B"), 
    value = c(4, 5, 6, 7, 8, 9), 
    groupmeanvalue = c(5, 5, 5, 8, 8, 8) 
) 

> dat2 
    group value groupmeanvalue 
1  A  4    5 
2  A  5    5 
3  A  6    5 
4  B  7    8 
5  B  8    8 
6  B  9    8 
+0

Это может быть лучше дублировать, поскольку он использует 'mutate': https://stackoverflow.com/questions/29657265/easy-way-to-append-mean -value-используя-dplyr-в-г –

ответ

0
dat <- dat %>% 
    group_by(group) %>% 
    mutate(groupmeanvalue = mean(value)) 

dat 
Source: local data frame [6 x 3] 
Groups: group [2] 

    group value groupmeanvalue 
    (fctr) (dbl)   (dbl) 
1  A  4    5 
2  A  5    5 
3  A  6    5 
4  B  7    8 
5  B  8    8 
6  B  9    8 
0

Мы можем использовать ave из base R

dat$groupmeanvalue <- with(dat, ave(value, group)) 
dat$groupmeanvalue 
#[1] 5 5 5 8 8 8 

Или другой вариант с data.table

library(data.table) 
setDT(dat)[, groupmeanvalue := mean(value), by = group]