R按多列分组,并根据不同列每组平均值

R按多列分组,并根据不同列每组平均值,r,group-by,dplyr,R,Group By,Dplyr,数据集存在年龄、性别、州、收入、组的数据。组表示每个用户所属的组: group gender state age income 1 3 Female CA 33 $75,000 - $99,999 2 3 Male MA 41 $50,000 - $74,999 3 3 Male KY 32 $35,000 - $49,999 4 2

数据集存在年龄、性别、州、收入、组的数据。组表示每个用户所属的组:

     group      gender state age       income
 1       3      Female  CA     33  $75,000 - $99,999
 2       3        Male  MA     41  $50,000 - $74,999
 3       3        Male  KY     32  $35,000 - $49,999
 4       2      Female  CA     23  $35,000 - $49,999
 5       3        Male  KY     25  $50,000 - $74,999
 6       3        Male  MA     21  $75,000 - $99,999
 7       3      Female  CA     33  $75,000 - $99,999
 8       3        Male  MA     41  $50,000 - $74,999
 9       3        Male  KY     32  $35,000 - $49,999
10       2      Female  CA     23  $35,000 - $49,999
11       3        Male  KY     25  $50,000 - $74,999
12       3      Female  MA     21  $75,000 - $99,999
以上是虚拟数据,目标是获得正确的概念

目标是按
组、性别、收入进行分组,并从属于该组的用户处获得计数和每组的平均年龄。然后按以下结构设置数据:“扩展版本”

以下是尝试:使用
dplyr

> data %>% group_by(group, 
+ gender, 
+ state, 
+ income) %>% 
+ summarize(n()) %>% 
+ mutate(mean_age = mean(age))

我也在探索
spread
功能

您可以在一次调用
summary()
中同时计算计数和平均值:

对于宽数据,样本中的变量名称不会唯一标识给定数据点的含义,因为唯一的单位是
组X性别X状态X收入
,但每个
组只有一行

由于您有两个摘要,因此摘要类型是唯一标识的附加层。因此,要将所有内容放在一行中,您需要使用变量名,如
[group]\u[gender]\u[state]\u[income]\u[summary]
。例如,
2女性约$35000-$49999\u计数


可能有一个更好的宽形状-您在宽数据框上进行什么类型的计算

您可以在一次调用
summary()
中同时计算计数和平均值:

对于宽数据,样本中的变量名称不会唯一标识给定数据点的含义,因为唯一的单位是
组X性别X状态X收入
,但每个
组只有一行

由于您有两个摘要,因此摘要类型是唯一标识的附加层。因此,要将所有内容放在一行中,您需要使用变量名,如
[group]\u[gender]\u[state]\u[income]\u[summary]
。例如,
2女性约$35000-$49999\u计数


可能有一个更好的宽形状-您在宽数据框上进行什么类型的计算

除了@treysp的答案之外,您还可以使用
unite
spread
创建一个宽大(且笨拙)的表。(我使用
as.data.frame()
仅强制打印所有列)


样本数据
df除了@treysp的答案之外,您还可以使用
unite
spread
创建一个宽大(且笨拙)的表。(我使用
as.data.frame()
仅强制打印所有列)


样本数据
df
> data %>% group_by(group, 
+ gender, 
+ state, 
+ income) %>% 
+ summarize(n()) %>% 
+ mutate(mean_age = mean(age))
library(dplyr)    

data %>% group_by(group, 
                  gender, 
                  state, 
                  income) %>% 
  summarize(count = n(), mean_age = mean(age))
require(tidyverse);
df %>%
    group_by(group, gender, state, income) %>%
    summarize(n = n(), mean_age = mean(age)) %>%
    unite(key, gender, state, income) %>%
    spread(key, n) %>% as.data.frame();
#  group mean_age Female_CA_$35,000 - $49,999 Female_CA_$75,000 - $99,999
#1     2       23                           2                          NA
#2     3       21                          NA                          NA
#3     3       25                          NA                          NA
#4     3       32                          NA                          NA
#5     3       33                          NA                           2
#6     3       41                          NA                          NA
#  Female_MA_$75,000 - $99,999 Male_KY_$35,000 - $49,999
#1                          NA                        NA
#2                           1                        NA
#3                          NA                        NA
#4                          NA                         2
#5                          NA                        NA
#6                          NA                        NA
#  Male_KY_$50,000 - $74,999 Male_MA_$50,000 - $74,999 Male_MA_$75,000 - $99,999
#1                        NA                        NA                        NA
#2                        NA                        NA                         1
#3                         2                        NA                        NA
#4                        NA                        NA                        NA
#5                        NA                        NA                        NA
#6                        NA                         2                        NA
#
df <- read.table(text =
    "group      gender state age       income
 1       3      Female  CA     33  '$75,000 - $99,999'
 2       3        Male  MA     41  '$50,000 - $74,999'
 3       3        Male  KY     32  '$35,000 - $49,999'
 4       2      Female  CA     23  '$35,000 - $49,999'
 5       3        Male  KY     25  '$50,000 - $74,999'
 6       3        Male  MA     21  '$75,000 - $99,999'
 7       3      Female  CA     33  '$75,000 - $99,999'
 8       3        Male  MA     41  '$50,000 - $74,999'
 9       3        Male  KY     32  '$35,000 - $49,999'
10       2      Female  CA     23  '$35,000 - $49,999'
11       3        Male  KY     25  '$50,000 - $74,999'
12       3      Female  MA     21  '$75,000 - $99,999'", header = T, row.names = 1)