每组平均值和范围

时间:2016-07-26 03:00:08

标签: r

我无法理解如何解决这个问题。任何人都可以帮我解决问题。

我有data.frame,如下所示

Gender  Age  BMI
Male     20  18
Male     40  22
Female   30  19
Male     50  24
Female   28  21

我想获取data.frame,如下所示

Age Range  Male-BMI-Average  Female-BMI-Average
0-25        ###                  ###
26-50       ###                  ###   

我尝试使用剪切和dcast,但我无法理解如何在年龄范围内获得不同性别群体的平均值?

2 个答案:

答案 0 :(得分:0)

我们可以使用cut创建'AgeRange',然后使用dcast data.table将其转换为'wide'格式,这在data.table中更容易dcastfun.aggregate(此处我们将其指定为mean)。

library(data.table)
dcast(setDT(df1)[, AgeRange := cut(Age, breaks = c(0, 25, 50), 
                labels = c("0-25", "26-50"))], 
                AgeRange~Gender, value.var = "BMI", mean)
#   AgeRange Female Male
#1:   0-25    NaN   18
#2:  26-50     20   23

或者使用dplyr,我们可以按cut创建的'AgeRange'和summarise分组,其中mean的'BMI'对应于'男', “性别”专栏中的“女性”。

library(dplyr)
df1 %>%
    group_by(AgeRange = cut(Age, breaks = c(0, 25, 50), 
                       labels = c("0-25", "26-50"))) %>%
    summarise(Male_BMI_Avg = mean(BMI[Gender=="Male"]), 
              Female_BMI_Avg = mean(BMI[Gender=="Female"]))
#  AgeRange Male_BMI_Avg Female_BMI_Avg
#    <fctr>        <dbl>          <dbl>
#1     0-25           18            NaN
#2    26-50           23             20

答案 1 :(得分:0)

这是使用dplyr和reshape2包的解决方案:

#Your Data
df<-read.table(header = TRUE, text="Gender  Age  BMI
Male     20  18
               Male     40  22
               Female   30  19
               Male     50  24
               Female   28  21")


library(dplyr)
results<-summarize(group_by(df, Gender, cut(df$Age, breaks=c(0, 25, 50))), mean(BMI))
library(reshape2)
names(results)<-c("Gender", "Age", "mean-BMI")
dcast(results, Age~Gender)