我正在尝试使用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的新手,我无法在任何地方找到答案。
答案 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
能够计算组其他统计数据(包括用户编写的函数)。