计算不同因素组合的行数

elc*_*ano 2 r dplyr

考虑到诸如 classic 之类的数据集mtcars,我想知道不同级别因素的观察数(=行),将它们分开以及一起考虑。

例如,下面的代码将生成一个列 N,其中包含每个级别的 cyl 和 gear 的观察数,但不会分别生成 cyl 和 gear 的观察数。

mtcars %>% dplyr::group_by(cyl, gear) %>% dplyr::summarise(N = n()) 
Run Code Online (Sandbox Code Playgroud)

我知道可以以类似的方式获得单独数量的 cyl 和 gear 观测值,创建单独的数据帧,然后将它们合并在一起。以下将生成预期的输出:

df <- mtcars %>% dplyr::group_by(cyl, gear) %>% dplyr::summarise(N = n())
df_gear <- mtcars %>% dplyr::group_by(gear) %>% dplyr::summarise(Ngear = n())
df_cyl <- mtcars %>% dplyr::group_by(cyl) %>% dplyr::summarise(Ncyl = n())
df %>% dplyr::left_join(df_cyl) %>% dplyr::left_join(df_gear)
Run Code Online (Sandbox Code Playgroud)

但我想知道是否有一种更简洁的方法来生成这个数据集,希望不需要生成中间数据集。

H 1*_*H 1 5

这是您可以解决此问题的一种方法,依靠mutate()ave()代替group_by()summarise()为了紧凑性:

library(dplyr)

mtcars %>% 
  mutate(n = ave(cyl, cyl, gear, FUN = length),
         n_cyl = ave(cyl, cyl, FUN = length),
         n_gear = ave(gear, gear, FUN = length)) %>%
  select(gear, cyl, n, n_cyl, n_gear) %>%
  distinct()

  gear cyl  n n_cyl n_gear
1    4   6  4     7     12
2    4   4  8    11     12
3    3   6  2     7     15
4    3   8 12    14     15
5    3   4  1    11     15
6    5   4  2    11      5
7    5   8  2    14      5
8    5   6  1     7      5
Run Code Online (Sandbox Code Playgroud)