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)