假设我想计算每个组中不同值的比例。例如,使用mtcars数据,我如何计算齿轮数的相对频率由am(自动/手动)与dplyr一步走?
library(dplyr)
data(mtcars)
mtcars <- tbl_df(mtcars)
# count frequency
mtcars %>%
group_by(am, gear) %>%
summarise(n = n())
# am gear n
# 0 3 15
# 0 4 4
# 1 4 8
# 1 5 5
我想达到的目标:
am gear n rel.freq
0 3 15 0.7894737
0 4 4 0.2105263
1 4 8 0.6153846
1 5 5 0.3846154
尽管有很多答案,但还有一种方法使用prop。与dplyr或data.table结合使用。
library(dplyr)
mtcars %>%
group_by(am, gear) %>%
tally() %>%
mutate(freq = prop.table(n))
#> # A tibble: 4 × 4
#> # Groups: am [2]
#> am gear n freq
#> <dbl> <dbl> <int> <dbl>
#> 1 0 3 15 0.789
#> 2 0 4 4 0.211
#> 3 1 4 8 0.615
#> 4 1 5 5 0.385
library(data.table)
cars_dt <- as.data.table(mtcars)
cars_dt[, .(n = .N), keyby = .(am, gear)][, freq := prop.table(n), by = "am"][]
#> am gear n freq
#> 1: 0 3 15 0.7894737
#> 2: 0 4 4 0.2105263
#> 3: 1 4 8 0.6153846
#> 4: 1 5 5 0.3846154
使用reprex v2.0.2创建于2022-10-22
你可以使用count()函数,但是根据dplyr版本的不同,它有不同的行为:
Dplyr 0.7.1:返回一个未分组的表:您需要通过am重新分组
Dplyr < 0.7.1:返回一个分组表,因此不需要再次分组,尽管您可能希望为以后的操作取消group()
抑郁症是0.7.1
mtcars %>%
count(am, gear) %>%
group_by(am) %>%
mutate(freq = n / sum(n))
德普林斯
mtcars %>%
count(am, gear) %>%
mutate(freq = n / sum(n))
这将生成一个分组表,如果您希望将其用于进一步分析,使用ungroup()删除分组属性可能会很有用。