使用dplyr将聚合列添加到数据框

时间:2016-07-26 19:37:34

标签: r dplyr

我正在尝试使用dplyr将聚合列添加到数据框。以下是我想到的一个例子:

gender <- c("male", "female", "male")
age <- c(25, 30, 56)
weight <- c(160, 110, 220)
mydata <- data.frame(gender, age, weight)

我按性别对数据框 mydata 进行分组,然后进行汇总计算以按性别查找平均权重:

library(dplyr)
mydata <- group_by(mydata, gender)
mydata2 <- summarise(mydata, wt=mean(weight))

有没有办法在上述同一步骤中将平均权重列添加到原始数据框?在SQL中,我将使用以下代码行来实现此目的:

SELECT gender, age, weight, avg(weight) as avg_wt FROM mydata GROUP BY gender

我意识到这是一个非常基本的问题,但我是R的新手,我无法在任何地方找到答案。

2 个答案:

答案 0 :(得分:4)

使用mutate代替summarise

mydata %>% group_by(gender) %>% mutate(wt = mean(weight))


#Source: local data frame [3 x 4]
#Groups: gender [2]
#
#  gender   age weight    wt
#  (fctr) (dbl)  (dbl) (dbl)
#1   male    25    160   190
#2 female    30    110   110
#3   male    56    220   190

答案 1 :(得分:1)

如果感兴趣,可以使用ave函数在基础R中完成:

mydata$avg_wt <- ave(mydata$weight, mydata$gender, FUN=mean)

第一个参数是应用函数的变量,第二个参数是分组变量,而第三个参数是将由组应用的函数。

 mydata
  gender age weight avg_wt
1   male  25    160    190
2 female  30    110    110
3   male  56    220    190

请注意,FUN参数的默认值为“mean”,因此可以将上述代码缩短为

mydata$avg_wt <- ave(mydata$weight, mydata$gender)

我在上面的答案中添加了这个参数作为一个指示,尽管它的名称,ave能够计算组其他统计数据(包括用户编写的函数)。