我使用以下数据集作为示例:
Age Gender CarType Group Education
1 46 Male Sedan 1 BS
2 37 Male SUV 1 MS
3 47 Female Sedan 2 PhD
4 20 Male SUV 2 HS
5 41 Male SUV 1 MS
6 52 Male Sedan 2 MS
我的目标是使用Group
变量进行分组,然后按组显示每列的统计信息。
Group Male Female Female-Mean-age Male-Mean-AGE Sedan SUV PhD BS MS
1 3 0 0 41.3 1 2 0 1 2
df %>% group_by(Group) %>% summarise(n = n())
只是给出计数,但当我尝试添加mutate并收集每个性别的计数时,我会收到错误
df %>% group_by(Group, Gender) %>% summarize(n=n()) %>% mutate(male = count('Male'))
我是否需要在group_by
中包含所有列以便稍后访问总和或计数,或者最好的方法是什么?
答案 0 :(得分:4)
一个选项是gather
进入' long'格式并获得'计数'对于多列,spread
它为' wide'格式,然后使用mean
'年龄'由' Group'计算和'性别'
library(tidyr)
library(dplyr)
res1 <- gather(df1, key, val, Gender, CarType, Education) %>%
group_by(Group, key, val) %>%
summarise(n = n()) %>%
ungroup %>% select(-key) %>%
spread(val, n, fill = 0)
res2 <- df1 %>%
group_by(Group, Gender) %>%
summarise(Age_Mean = mean(Age)) %>%
mutate(Gender = paste0(Gender, "_Mean")) %>%
spread(Gender, Age_Mean, fill = 0)
left_join(res1, res2)
# A tibble: 2 x 11
# Group BS Female HS Male MS PhD Sedan SUV Female_Mean Male_Mean
# <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 1 1.00 0 0 3.00 2.00 0 1.00 2.00 0 41.3
#2 2 0 1.00 1.00 2.00 1.00 1.00 2.00 1.00 47.0 36.0
答案 1 :(得分:2)
这是一种避免使用left_join
和中间对象的替代方法,但无论您觉得这更容易理解还是阅读,都是您的通话。在不知道数据形状的情况下,很难说出最简单的方法。如果你想要最大年龄,这个方法每个额外的不同摘要函数只需要额外的一行或两行,而上述需要另外一个left_join
和另一个df
。但是,如果你有更多的变量需要计算,上面会更容易,因为它不会为具有相同汇总函数的更多变量添加行。
该方法基本上是使用mutate
将正确的分组摘要添加为新列,然后使用spread
为每个列创建正确的列名称。我们可以通过Group
调用summarise
来减少所有内容。我使用median
因为我们选择的汇总函数并不重要,此时所有变量都应该为每个组都有一个值而mean
产生NaN
这有点刺激性
N.B。 mutate_at
的最后一行将计数中的所有NA
变为0.但是,我选择不替换NA
中的mean_age_Female
,因为NA
暗示与0
不同的东西。这是目前这个解决方案与另一个解决方案之间的输出差异,尽管这是一个很小的修复。
library(tidyverse)
tbl <- read_table2(
"Age Gender CarType Group Education
46 Male Sedan 1 BS
37 Male SUV 1 MS
47 Female Sedan 2 PhD
20 Male SUV 2 HS
41 Male SUV 1 MS
52 Male Sedan 2 MS"
)
#> Warning: 2 parsing failures.
#> row # A tibble: 2 x 5 col row col expected actual file expected <int> <chr> <chr> <chr> <chr> actual 1 5 <NA> 5 columns 6 columns literal data file 2 6 Education "" embedded null literal data
tbl %>%
add_count(Group, Gender) %>% # Add all summary statistics as columns
add_count(Group, CarType) %>%
add_count(Group, Education) %>%
group_by(Group, Gender) %>%
mutate(., mAge = mean(Age)) %>%
mutate(Gender2 = str_c("mean_age_", Gender)) %>%
spread(Gender, n) %>% # Convert all to new columns
spread(Gender2, mAge) %>%
spread(CarType, nn) %>%
spread(Education, nnn) %>%
group_by(Group) %>% # Collapse to one row per group
summarise_at(vars(-Age), function(x) median(x, na.rm = TRUE)) %>%
mutate_at(vars(-starts_with("mean_age_")), function(x) replace_na(x, 0))
#> # A tibble: 2 x 11
#> Group Female Male mean_age_Female mean_age_Male Sedan SUV BS HS
#> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 1.00 0 3.00 NA 41.3 1.00 2.00 1.00 0
#> 2 2.00 1.00 2.00 47.0 36.0 2.00 1.00 0 1.00
#> # ... with 2 more variables: MS <dbl>, PhD <dbl>
由reprex package(v0.2.0)于2018-03-05创建。