考虑到诸如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)
但是我想知道是否有一种更干净的方法来生成此数据集,希望无需生成中间数据集。
下面是你可能会接近这个,依靠一种方式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