温馨提示:本文翻译自stackoverflow.com,查看原文请点击:r - Counting the number of rows for different combinations of factors
dplyr r

r - 计算不同因素组合的行数

发布于 2020-03-31 23:44:40

考虑到诸如classic之类的数据集mtcars,我想知道按不同水平的因素将观察值(=行)分开或同时进行的情况。

例如,以下代码将生成一列N,其中包含每级气缸和齿轮的观测值数量,而不是分别针对气缸和齿轮的观测值数量。

mtcars %>% dplyr::group_by(cyl, gear) %>% dplyr::summarise(N = n()) 

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

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)

但是我想知道是否有一种更干净的方法来生成此数据集,希望无需生成中间数据集。

查看更多

提问者
elcortegano
被浏览
13
H 1 2020-01-31 20:44

下面是你可能会接近这个,依靠一种方式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